前言
最近比較空閑,就想摸索學習下JNI開發(fā).現(xiàn)在行業(yè)競爭越來越激烈,JNI開發(fā)我們在面試上,遇見的頻率還算是挺高的,因此,非常有必要去學習和鉆研這個比較重要的技術的!
經過我多次的摸索,新建了N次項目,終于成功手動的實現(xiàn)了在原有的項目上集成NDK開發(fā)環(huán)境,下面把我自己的經驗分享給大家(我在網(wǎng)上搜索了一圈,看了很多篇文章都沒有找到一個能夠完全的解決我的問題的文章)
如果你現(xiàn)在有空的話,不妨打開AS,跟我一起來學習如何配置NDK開發(fā)環(huán)境吧!!!
第一步 : 創(chuàng)建一個新的項目.(這里不要勾選include c++ support)
第二步 :集成NDK環(huán)境
準備工作:
首先確認下AS有沒有下載過NDK插件
確認方式:打開你的項目設置(按ctrl+ alt +shift +s)
如果目錄是空的.下面應該有提示讓你去下載的.你點擊下載等待下載完畢重啟AS即可.
當你看到這個地方,我就默認你已經下載好了NDK,并且和我的步驟是同步的!

對項目進行一些細節(jié)設置
-
1.gradle.properties文件的最后一行增加 android.useDeprecatedNdk=true
image.png -
2.在module級別的build.gradle中這樣設置 ,然后rebuild一下 就OK了
image.png
第三步:創(chuàng)建一個Java類 寫上一個native方法
-
從下圖,我們可以看出,這個方法是爆紅的,看下面的提示,大致意思就是該方法無法被識別或解析,說明我們的工作還沒有完成.
image.png
第四步:在Terminal命令行下,執(zhí)行以下切換目錄
cd /d ./app/src/main/java

第五步:編譯生成該類中的C/C++文件(如下所示) [↙有備注哦] ,完成之后rebuild一下
[備注:如果是第一次閱讀的話,請先留意一下后期補充]
同樣使用命令行執(zhí)行 javah -d ../jni cn.senjoeson.studyndk.Hello 編譯生成該類中的C++/C文件
-d表示創(chuàng)建一個目錄
../jni 需要創(chuàng)建的目錄
cn.senjoeson.studyndk.Hello表示編譯生成該類

關于如何更加方便使用以上的命令,請參考我在網(wǎng)上找的一篇文章,希望可以幫助大家除去每次手動執(zhí)行命令的煩惱!
Android Studio配置NDK外部命令工具
第六步,解決rebuild后報的錯誤
別慌,也別急著去百度,它其實就是告訴你,使用了過時的ndk,無法兼容.下面按照我說的做,可以解決這個問題.

- 1.先選中你所在的module,右鍵之后如下所示

- 2.點擊Link C++ Project with Gradle按鈕 會彈出下面的對話框.

我們是選擇Ndk-build的,但是你翻來找去,你壓根沒有發(fā)現(xiàn)所謂的Android.mk,
是不是心里在嘀咕,這不是坑爹么? 哈哈.我當時就是這么想的!!后來,我觀察了下自動生成的這個目錄

是不是心里在想 這是不是有什么關聯(lián)呢? OK.你猜對了 ,我當時就是覺得這個有可能就是它要找的那個文件,所以我把它復制到項目的根目錄了!!
- 3.復制Android.mk文件到項目根目錄

-
填入Android.mk的路徑并點擊OK
image.png
-
這個時候,項目會進行重新編譯.就可以解決以上報的錯誤,
第七步:修改Andriod.mk的LOCAL_SRC_FILES路徑
重新編譯之后我們再次打開Hello類,你發(fā)現(xiàn)它的native方法依然是爆紅的,
這可咋辦啊?我當時也是卡在這個地方,找遍了方法,我感覺可能我哪個地方搞錯了!!
我一遍遍排查,找文檔,查資料,最后將問題定位在Android.mk文件上(如下圖所示),此處是關聯(lián)C++源碼文件(為了實現(xiàn)這個native方法),

那么我們就創(chuàng)建一個C++文件,然后把Android.mk的路徑修改一下

然后重新編譯,你是不是發(fā)現(xiàn)你再次打開.h文件的時候,字體顏色都不一樣了么?
第八步: 在Hello.cpp文件中實現(xiàn)這個native方法.
把下面這個文件的內容全部復制到剛剛新建的Hello.cpp文件中

我們這里就簡單的輸出一個語句(其實難的我也不會.哈哈)

我們再次打開Hello類,你會發(fā)現(xiàn)那個native方法已經不再爆紅.說明我們已經集成成功了!
第九步.在Java代碼中引入庫.
我們需要加載庫才能讓Java代碼能夠識別C++代碼

注意事項:
我在上圖標注的地方表明需要兩者要一樣,不然可能報錯.
最后我們讓該方法使用并讓程序跑起來

如果你還有興趣想了解關于在現(xiàn)有項目的集成NDK環(huán)境(Cmake方式),請戳關于在現(xiàn)有項目的集成NDK環(huán)境(Cmake方式)
如果以上文章能夠幫助到你,請幫我點擊一下喜歡,非常感謝!
文章可能有寫的不好的地方,如有不妥之處,請聯(lián)系我糾正!謝謝大家!
后期補充:
根據(jù)我后面自己多次測試,發(fā)現(xiàn)在第五步的時候,編譯生成該類的C/C++文件之后,直接創(chuàng)建實現(xiàn)該方法的C++文件,然后rebuild,就不需要手動去修改Android.mk里面的LOCAL_SRC_FILES路徑了,它會直接自動生成.



