Android Studio 運行NDK程序時踩過的那些坑

首先洁奈,我把Windows下NDK開編寫JNI的流程說一下,在整個流程中著重點出里面的一些坑绞灼,以免其他開發(fā)者步我后塵利术。
1、NDK環(huán)境搭建
這個就不在這里說了镀赌,不是重點氯哮,大家自行g(shù)oogle、百度商佛。
2喉钢、JNI開發(fā)
1)創(chuàng)建Android項目。
2)查看項目local.properties中加入ndk和sdk的路徑是否正確

     ndk.dir=/Users/userName/AndroidStudioProjects/ndk/android-ndk-r13b
      sdk.dir=/Users/userName/Library/Android/sdk

3)配置項目下的gradle.properties文件良姆,表示我們要使用NDK進行開發(fā)肠虽。

android.useDeprecatedNdk=true

4)在moudle根目錄下的的build.gradle中的defaultConfig標(biāo)簽內(nèi)部里加入如下代碼

ndk{    
moduleName "secret"   //生成的so文件名字,跟System.loadLibrary("secret");  中的名字相對應(yīng)  
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種平臺下的so庫,
// 還可以添加 'x86_64', 'mips', 'mips64'
}

5)編寫jni代碼

package com.david.ndktest;
-
public class MainActivity extends AppCompatActivity {

 //使用靜態(tài)代碼塊玛追,表示我們要加載的資源文件為libsecret.so
 static {
     System.loadLibrary("secret");
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     TextView tv_msg = (TextView) findViewById(R.id.tv_msg);
     tv_msg.setText(stringFromat());

 }
 //聲明一個本地方法税课,用native關(guān)鍵字修飾
 public native String stringFromat();
}

6)生成.h頭文件
直接使用Android Studio 底部的Terminal,默認(rèn)命令行窗口路徑已經(jīng)在當(dāng)前項目痊剖,進入到app/src/main/java目錄韩玩,輸入以下命令(固定格式:javah -jni 包名+類名),這個一般的博客網(wǎng)站告訴我們的命令

javah -jni com.david.ndktest.MainActivity

好了陆馁,這里存在幾個坑找颓,首先第一個坑
1、Terminal提示 錯誤:找不到‘com.david.ndktest.MainActivity’類文件
原因:java沒有包含 Android SDK中的 java 文件
解決辦法:
找到Android sdk目錄叮贩,找到platforms文件夾击狮,進入“android-20”(或者其他版本也行)佛析,然后找到 “android.jar” 文件,將其添加到計算機環(huán)境變量的 CLASSPATH 中彪蓬。重啟一下Terminal或者AndroidStudio
再次執(zhí)行“javah -jni com.david.ndktest.MainActivity”寸莫,好了這里又出了一個小坑
2、Terminal提示 錯誤:編碼GBK的不可映射字符
原因:由于JDK是國際版的档冬,在編譯的時候膘茎,如果我們沒有用-encoding參數(shù)指定我們的JAVA源程序的編碼格式,則javac.exe首先獲得我們操作系統(tǒng)默認(rèn)采用的編碼格式捣郊。
解決辦法:應(yīng)該使用-encoding參數(shù)指明編碼方式辽狈,如:javah -jni -encoding UTF-8 com.david.ndktest.MainActivity

好了,以上兩個坑解決掉了呛牲,再次執(zhí)行命令javah -jni -encoding UTF-8 com.david.ndktest.MainActivity 這次Terminal沒有任何輸出,說明我們已經(jīng)成功的在java文件夾下生成了com.david.ndktest.MainActivity.h頭文件驮配,如下:

頭文件.png

我們把頭文件名字改成secret.c(一定要改成.c文件才能編譯), Build ->Build Project 一下工程娘扩,但是問題來了,我們并沒有在項目的build\intermediates\目錄下看到ndk文件夾壮锻,說明編譯之后沒有生成相應(yīng)的so庫琐旁,這是第三個坑
3、原因:secret.c文件在java文件夾下都是java源代碼猜绣,AndroidStudio無法識別其中的c文件灰殴,自然不會去編譯。
解決辦法:將命令:javah -jni -encoding UTF-8 com.david.ndktest.MainActivity 改成
javah -jni -d ../jni -encoding UTF-8 com.david.ndktest.MainActivity 這樣就會在java目錄的上一級main目錄下自動生成jin文件夾掰邢,并將生成的頭文件放到里面牺陶。
好了,我們在執(zhí)行一下命令辣之,然后把jni文件夾下生成的文件的文件名改成secret.c掰伸,再Build ->Build Project 一下,在build\intermediates\ndk文件夾下看到了打包好的so庫怀估,好了狮鸭,到這里終于松了一口氣。
7)如果6)無法進行多搀,可以直接從其他地方復(fù)制頭文件進來歧蕉,或者自己根據(jù)格式寫一個.c的文件,放到src/main/jni目錄下;

如遇到編譯錯誤康铭,如下:
圖片.png
解決辦法:
圖片.png

加上紅線標(biāo)記的代碼即可惯退,因為jni每次運行都會在build\intermediates\ndk中自動編譯生成一個Android.mk文件,這樣我們之前在jni中手動編譯的Android.mk就沒有作用了麻削,加上這句后就不會自動編譯了蒸痹,用的是我們自己的mk文件春弥。

8)在secret.c文件里實現(xiàn)stringFormat方法如下:

圖片.png

9)編譯C/C++文件,輸出 .so文件(第六步無法生成so文件條件下叠荠,采用如下方式)
1匿沛、cd命令進入創(chuàng)建的jni文件夾下;
2、執(zhí)行ndk-build命令

若出現(xiàn)如下圖所示錯誤:
圖片.png
解決辦法:

在build\intermediates\ndk\debug目錄下找到Android.mk文件榛鼎,將其復(fù)制黏貼到src\main\jni文件加下逃呼,再次執(zhí)行ndk-build即可自動生成so文件,可在src\mian\libs目錄下查看者娱。

運行該工程抡笼,OK,native方法調(diào)用成功黄鳍,效果如下:

圖片.png

注意:
1推姻、build.gradle 里面的moduleName "xxx" 跟System.loadLibrary("xxx");的名字要對應(yīng)起來,但是c文件的名字可以自定義框沟,不一定要一樣藏古。
2、相關(guān)參考資料來自
http://blog.csdn.net/qq_36788768/article/details/59487103
http://www.2cto.com/kf/201706/648968.html忍燥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拧晕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梅垄,更是在濱河造成了極大的恐慌厂捞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队丝,死亡現(xiàn)場離奇詭異靡馁,居然都是意外死亡,警方通過查閱死者的電腦和手機炭玫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門奈嘿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吞加,你說我怎么就攤上這事裙犹。” “怎么了衔憨?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵叶圃,是天一觀的道長。 經(jīng)常有香客問我践图,道長掺冠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮德崭,結(jié)果婚禮上斥黑,老公的妹妹穿的比我還像新娘。我一直安慰自己眉厨,他們只是感情好锌奴,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憾股,像睡著了一般鹿蜀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上服球,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天茴恰,我揣著相機與錄音,去河邊找鬼斩熊。 笑死往枣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的座享。 我是一名探鬼主播婉商,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渣叛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盯捌,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淳衙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饺著,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫攀,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年幼衰,在試婚紗的時候發(fā)現(xiàn)自己被綠了靴跛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡渡嚣,死狀恐怖梢睛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情识椰,我是刑警寧澤绝葡,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站腹鹉,受9級特大地震影響藏畅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜功咒,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一愉阎、第九天 我趴在偏房一處隱蔽的房頂上張望绞蹦。 院中可真熱鬧,春花似錦榜旦、人聲如沸幽七。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锉走。三九已至净宵,卻和暖如春缆毁,著一層夾襖步出監(jiān)牢的瞬間土浸,已是汗流浹背帖汞。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工膳算, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留换途,地道東北人滑废。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓笋除,卻偏偏與公主長得像踏兜,于是被迫代替她去往敵國和親词顾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,290評論 25 707
  • demo鏈接在文末碱妆。 在Android Studio中有3種方法生成so文件肉盹。 最初的時候,我曾經(jīng)使用過Visua...
    梧葉已秋聲閱讀 33,753評論 5 26
  • 一疹尾、NDK產(chǎn)生的背景 Android平臺從誕生起上忍,就已經(jīng)支持C、C++開發(fā)纳本。眾所周知窍蓝,Android的SDK基于J...
    Ten_Minutes閱讀 3,509評論 1 27
  • Android游戲開發(fā)實踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實踐(1)之NDK與JNI...
    AlphaGL閱讀 3,755評論 0 24
  • 易燃易爆炸 第一章 “你以為這是什么地方,還能由得了你們這些毛都沒長全的小孩兒撒野繁成?” “大晚上還鬧吓笙!鬧你他媽的什...
    一顆榮w閱讀 294評論 0 0