Android:隨筆——新的 NDK/JNI 調(diào)用方式

轉(zhuǎn)載請標(biāo)明地址 QuincySx: http://www.reibang.com/p/c6108131ba0f

眾所周知現(xiàn)在 Android 開發(fā)已經(jīng)到了 Android Studio 的時(shí)代猜惋,那么 JNI 的調(diào)用方式也經(jīng)過了好幾代

  1. 在eclipse 時(shí)代就存在的 ndk-build 方式
  1. 使用 Google 官方的 com.android.tools.build:gradle-experimental 簡書地址
  2. CMake 方式堪遂,支持?jǐn)帱c(diǎn)調(diào)試陡舅,這也是今天要說的是一種方式

使用 CMake 這種方式有幾個條件

  1. Android Studio 2.2 或更高版本
  1. Android Plugin for Gradle 版本 2.2.0 或更高版本

好了下面需要下點(diǎn)必要工具 下載 NDK 和構(gòu)建工具 要為您的應(yīng)用編譯和調(diào)試原生代碼吮旅,您需要以下組件:
Android 原生開發(fā)工具包 (NDK):這套工具集允許您為 Android 使用 C 和 C++ 代碼,并提供眾多平臺庫蚓土,讓您可以管理原生 Activity 和訪問物理設(shè)備組件肖粮,例如傳感器和觸摸輸入革半。
CMake:一款外部構(gòu)建工具砂蔽,可與 Gradle 搭配使用來構(gòu)建原生庫洼怔。如果您只計(jì)劃使用 ndk-build,則不需要此組件察皇。
LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試原生代碼泽台。

Paste_Image.png

如圖顯示的三個 就是需要下載的三個

使用 CMake 有兩種方式

  1. 第一種方式 是在項(xiàng)目創(chuàng)建的時(shí)候
  1. 第二種是在現(xiàn)有項(xiàng)目上添加

第一種方式

我們先介紹第一種方式 : 是建立新項(xiàng)目的時(shí)候

創(chuàng)建項(xiàng)目

復(fù)選 include C++ support 然后和正常項(xiàng)目一樣一直 Next 下一步

配置項(xiàng)目
  • C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標(biāo)準(zhǔn)什荣。選擇 Toolchain Default 會使用默認(rèn)的 CMake 設(shè)置。
  • Exceptions Support:如果您希望啟用對 C++ 異常處理的支持怀酷,請選中此復(fù)選框稻爬。如果啟用此復(fù)選框,Android Studio 會將 -fexceptions 標(biāo)志添加到模塊級 build.gradle 文件的 cppFlags 中蜕依,Gradle 會將其傳遞到 CMake桅锄。
  • Runtime Type Information Support:如果您希望支持 RTTI,請選中此復(fù)選框样眠。如果啟用此復(fù)選框友瘤,Android Studio 會將 -frtti 標(biāo)志添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake檐束。

根據(jù)自己情況選取 飯后點(diǎn)擊 Finish

在這種情況下 如果沒有安裝 CMake Android Studio 會提示安裝

這是項(xiàng)目結(jié)構(gòu)


項(xiàng)目結(jié)構(gòu)

第二種方式

第二種方式是 : 在原有想的基礎(chǔ)上添加

這種方式有三個步驟

  • 創(chuàng)建新的原生源文件并將其添加到您的 Android Studio 項(xiàng)目中辫秧。如果您已經(jīng)擁有原生代碼或想要導(dǎo)入預(yù)構(gòu)建的原生庫,則可以跳過此步驟被丧。
  • 創(chuàng)建 CMake 構(gòu)建腳本將您的原生源代碼構(gòu)建到庫中盟戏。如果導(dǎo)入和關(guān)聯(lián)預(yù)構(gòu)建庫或平臺庫绪妹,您也需要此構(gòu)建腳本。如果您的現(xiàn)有原生庫已經(jīng)擁有CMakeLists.txt構(gòu)建腳本或者使用 ndk-build 并包含Android.mk構(gòu)建腳本柿究,則可以跳過此步驟邮旷。
  • 提供一個指向您的 CMake 或 ndk-build 腳本文件的路徑,將 Gradle 關(guān)聯(lián)到您的原生庫蝇摸。Gradle 使用構(gòu)建腳本將源代碼導(dǎo)入您的 Android Studio 項(xiàng)目并將原生庫(SO 文件)打包到 APK 中婶肩。

首先在自己的模塊下新建 JNI 目錄

Paste_Image.png

然后切換顯示模式為 project 在 src > main 下會出現(xiàn)一個 jni 的目錄 創(chuàng)建c文件 名字隨意

然后在新建的文件夾下創(chuàng)建 C 的文件

如果需要頭文件 則需要勾選 Create an associated header

然后創(chuàng)建 CMakeLists.txt 文件 在模塊根目錄下創(chuàng)建(名字一定要是 CMakeLists.txt)

然后我們需要在文件中添加 cmake_minimum_required() 與 add_library() 兩個方法

#指定 CMake 的最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( 
             #模塊名 
             native

             #設(shè)置模塊是可共享的
             SHARED

             #C 文件的具體路徑 注意確認(rèn)文件名后綴
             src/main/jni/native.cpp )

# 指定頭文件路徑 這里我沒有創(chuàng)建 頭文件先注釋掉
# include_directories(src/main/jni/)

然后關(guān)聯(lián) CMake 與 Gradle

自動的方式
Paste_Image.png

選擇我們創(chuàng)建的 CMakeLists.txt 文件 點(diǎn)擊完成等待

手動方式
android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {
    // Encapsulates your CMake build configurations.
    cmake {
      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

然后在 JAVA 中調(diào)用

在 Java 代碼中 調(diào)用的時(shí)候 添加 這里的名字一定要和上面一致

static {
        System.loadLibrary("native");
    }

private native String getStr();

然后在書寫一下 C 文件 (這里我創(chuàng)建的是 C++ 文件)

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_a21vianet_quincysx_demo_jnidemo_MainActivity_getStr(JNIEnv *env, jclass type) {
    char str[] = "我是C";
    return (*env).NewStringUTF(str);
}

總結(jié)

這只是最簡單的一個 小例子,我水平不高也在學(xué)習(xí),深入學(xué)習(xí)后會有更多的文章分享給大家

水平問題探入,難免會有錯誤狡孔,多謝各位指正

參考資料


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜂嗽,隨后出現(xiàn)的幾起案子苗膝,更是在濱河造成了極大的恐慌,老刑警劉巖植旧,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辱揭,死亡現(xiàn)場離奇詭異,居然都是意外死亡病附,警方通過查閱死者的電腦和手機(jī)问窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來完沪,“玉大人域庇,你說我怎么就攤上這事「不” “怎么了听皿?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宽档。 經(jīng)常有香客問我尉姨,道長,這世上最難降的妖魔是什么吗冤? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任又厉,我火速辦了婚禮,結(jié)果婚禮上椎瘟,老公的妹妹穿的比我還像新娘覆致。我一直安慰自己,他們只是感情好肺蔚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布篷朵。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪声旺。 梳的紋絲不亂的頭發(fā)上笔链,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音腮猖,去河邊找鬼鉴扫。 笑死,一個胖子當(dāng)著我的面吹牛澈缺,可吹牛的內(nèi)容都是我干的坪创。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姐赡,長吁一口氣:“原來是場噩夢啊……” “哼莱预!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起项滑,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤依沮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枪狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體危喉,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年州疾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辜限。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡严蓖,死狀恐怖薄嫡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颗胡,我是刑警寧澤毫深,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站杭措,受9級特大地震影響费什,放射性物質(zhì)發(fā)生泄漏钾恢。R本人自食惡果不足惜手素,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘩蚪。 院中可真熱鬧泉懦,春花似錦、人聲如沸疹瘦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邓嘹,卻和暖如春酣栈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汹押。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工矿筝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚贾。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓窖维,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妙痹。 傳聞我的和親對象是個殘疾皇子铸史,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容