關于在現(xiàn)有項目的集成NDK環(huán)境(ndk-build方式)

前言


最近比較空閑,就想摸索學習下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,并且和我的步驟是同步的!
確認ndk是否配置.png

對項目進行一些細節(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

image.png

第五步:編譯生成該類中的C/C++文件(如下所示) [↙有備注哦] ,完成之后rebuild一下

[備注:如果是第一次閱讀的話,請先留意一下后期補充]

同樣使用命令行執(zhí)行 javah -d ../jni cn.senjoeson.studyndk.Hello 編譯生成該類中的C++/C文件

   -d表示創(chuàng)建一個目錄 
  ../jni  需要創(chuàng)建的目錄  
   cn.senjoeson.studyndk.Hello表示編譯生成該類
此圖為后期補上的.png

關于如何更加方便使用以上的命令,請參考我在網(wǎng)上找的一篇文章,希望可以幫助大家除去每次手動執(zhí)行命令的煩惱!
Android Studio配置NDK外部命令工具

第六步,解決rebuild后報的錯誤

別慌,也別急著去百度,它其實就是告訴你,使用了過時的ndk,無法兼容.下面按照我說的做,可以解決這個問題.


image.png
  • 1.先選中你所在的module,右鍵之后如下所示
image.png
  • 2.點擊Link C++ Project with Gradle按鈕 會彈出下面的對話框.
image.png

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

image.png

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

  • 3.復制Android.mk文件到項目根目錄
image.png
    1. 填入Android.mk的路徑并點擊OK


      image.png

這個時候,項目會進行重新編譯.就可以解決以上報的錯誤,

第七步:修改Andriod.mk的LOCAL_SRC_FILES路徑

重新編譯之后我們再次打開Hello類,你發(fā)現(xiàn)它的native方法依然是爆紅的,
這可咋辦啊?我當時也是卡在這個地方,找遍了方法,我感覺可能我哪個地方搞錯了!!
我一遍遍排查,找文檔,查資料,最后將問題定位在Android.mk文件上(如下圖所示),此處是關聯(lián)C++源碼文件(為了實現(xiàn)這個native方法),


image.png

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

image.png

然后重新編譯,你是不是發(fā)現(xiàn)你再次打開.h文件的時候,字體顏色都不一樣了么?

第八步: 在Hello.cpp文件中實現(xiàn)這個native方法.

把下面這個文件的內容全部復制到剛剛新建的Hello.cpp文件中


image.png

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


image.png

我們再次打開Hello類,你會發(fā)現(xiàn)那個native方法已經不再爆紅.說明我們已經集成成功了!

第九步.在Java代碼中引入庫.

我們需要加載庫才能讓Java代碼能夠識別C++代碼


image.png

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


image.png

如果你還有興趣想了解關于在現(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路徑了,它會直接自動生成.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容