Android Studio3.4環(huán)境下使用JNI調用原生函數

應項目要求逻炊,需要從現有的as 項目中使用JNI調用C語言的功能。經過幾天的折騰汉操,現將一些心得記錄下來,以便下次查看蒙兰。

一磷瘤、項目環(huán)境配置

(1)安裝Android Studio(以下簡稱:AS) 3.4;配置好android環(huán)境搜变,具體細節(jié)省略采缚。

(2)安裝NDK、CMake挠他、LLDB扳抽。

按以下步驟在AS中打開SDKManager:TOOLS=>Appearance&Behaviour=>System Settings=>Android SDK找到SDK Tools。

如圖1殖侵,圖2 所示:

圖1 AS工具欄的Tools
圖2 SDK Tools

二贸呢、JNI demo實現細節(jié)

(1)、在app/src/main 目錄下新建文件夾jni(自定義)拢军,文件目錄如下


圖3 jni文件目錄

(2)在app/src/main/java/com/test/myjni目錄下新建一個Hello.java楞陷,內容如下

其中 native聲明此為JNI方法,在static中加載你要調用的包

圖4 HelloJni.java

在AS的terminal命令行中茉唉,定位到剛剛新建的jni文件夾下固蛾。由于使用的JDK 為12.0以后结执,沒有javah命令。因此艾凯,使用一下命令:

javac -h . path\HelloJni.java? 其中.的參數是你.h文件生成后要放到的位置(這里我是先將地址定位到app/src/main/jni文件夾下使用命令昌犹,.代表生成在命令行地址的當前目錄),path表示你剛剛新建的.java文件的全路徑(可能有更好的方法览芳,但是目前只會寫全路徑)斜姥。然后你會發(fā)現jni文件夾下多了一個.h文件(忽略.c文件,下面會說到)沧竟。如圖:


圖 5

接著在jni文件夾下新建.c文件(如圖5铸敏,我新建的是jnitest.c文件)。頭文件中聲明的是jni格式的在HelloJni.java中的方法悟泵,jni像是一座橋梁杈笔,連接C和JAVA.然后在jnitest.c中實現com_test_mybchjni_HelloJni.h中的方法。分別如下兩圖所示:


圖6 頭文件


圖7 C文件

以上所有需要的C文件和頭文件都新建好了糕非,接下來是配置Cmake文件蒙具。

(3)CMakeLists.txt文件的配置

在jni文件夾下新建CMakeLists.txt,記住名字不能錯朽肥。然后輸入以下內容:


圖8 CMakeLisrs.txt文件內容

然后App模塊下的build.gradle中添加內容禁筏,在下圖中的添加的位置不能錯,其中下圖2方框中CMakeLists.txt地址就是剛剛的jni地址(這個不一定要放在jni下衡招,放在其他文件夾下就更改成相應的文件夾地址)如圖:


圖9?

(4)關鍵一步來了

點擊AS工具欄Build,在下拉項中點擊Refresh Linked C++ project,完成后篱昔,點擊Make Project。即可在代碼中完成java通過JNI調用C始腾。

三州刽、效果展示

首先在app/src/main/res/layout/activity_main.xml文件下添加如下代碼(新建一個TextView控件):


? ? android:id="@+id/sample_text"

? ? android:layout_width="wrap_content"

? ? android:layout_height="wrap_content"

? ? android:text="Hello World!"

? ? app:layout_constraintBottom_toBottomOf="parent"

? ? app:layout_constraintLeft_toLeftOf="parent"

? ? app:layout_constraintRight_toRightOf="parent"

? ? app:layout_constraintTop_toTopOf="parent" />

圖10 文本控件

修改java的com/test/mybchjni 文件夾中的MainActivity(調用包)。如下:


圖11?

最后運行MainActivity.java得到:

圖12 最終展示

三浪箭、一些要注意的地方

(1)如果你要調用的是.c文件那么在實現頭文件時穗椅,所有的方法都要用

(*env)->GetCharElement(env,參數1,參數2)

而在C++中則只需要

env->GetCharElement(參數1奶栖,參數2)

(2)在使用C語言的文件中匹表,頭文件定義的方法,在C文件中實現時驼抹,參數必須時

參數類型+參數名桑孩,要不然會報錯拜鹤。

(3)如果你的C文件需要使用自定義C文件時框冀,需要將這個文件添加到CMakeList.txt文件中,配置方法與jnitest.c的方法一直敏簿,不同的就是明也,要使用單獨的addlibrary();

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末宣虾,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子温数,更是在濱河造成了極大的恐慌绣硝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑刺,死亡現場離奇詭異鹉胖,居然都是意外死亡,警方通過查閱死者的電腦和手機够傍,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門甫菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冕屯,你說我怎么就攤上這事寂诱。” “怎么了安聘?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵痰洒,是天一觀的道長。 經常有香客問我浴韭,道長丘喻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任念颈,我火速辦了婚禮仓犬,結果婚禮上,老公的妹妹穿的比我還像新娘舍肠。我一直安慰自己搀继,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布翠语。 她就那樣靜靜地躺著叽躯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肌括。 梳的紋絲不亂的頭發(fā)上点骑,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音谍夭,去河邊找鬼黑滴。 笑死,一個胖子當著我的面吹牛紧索,可吹牛的內容都是我干的袁辈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼珠漂,長吁一口氣:“原來是場噩夢啊……” “哼晚缩!你這毒婦竟也來了尾膊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荞彼,失蹤者是張志新(化名)和其女友劉穎冈敛,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體鸣皂,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡抓谴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了寞缝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐邦。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖第租,靈堂內的尸體忽然破棺而出措拇,到底是詐尸還是另有隱情,我是刑警寧澤慎宾,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布丐吓,位于F島的核電站,受9級特大地震影響趟据,放射性物質發(fā)生泄漏券犁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一汹碱、第九天 我趴在偏房一處隱蔽的房頂上張望粘衬。 院中可真熱鬧,春花似錦咳促、人聲如沸稚新。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褂删。三九已至,卻和暖如春冲茸,著一層夾襖步出監(jiān)牢的瞬間屯阀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工轴术, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难衰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓逗栽,卻偏偏與公主長得像盖袭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容