![]() Android Studio中項目NDK原生部分整合方式 十二月 10, 2014 | K-Res 發(fā)布
自從Android Studio出現(xiàn)以后,我就很少再使用Eclipse+ADT的組合做Android開發(fā)了,更快的反應速度和更人性化的操作方式以及智能感知方面等等的優(yōu)勢,確實體現(xiàn)出了Google最初宣傳Android Studio時的大部分特點,不過這些種種優(yōu)勢目前還只是體現(xiàn)在Java應用開發(fā)部分,而對于需要用到C/C++的Android NDK開發(fā)時,目前還沒有很好的支持,當然,參考目前Android Studio的版本迭代速度來看,這應該也只是時間問題,當初ADT剛出的時候也是問題多多,包括后來的CDT+NDK支持,最初也只是支持原生代碼的編譯生成so,過了很久很久的某次update才加入了原生代碼的可視化調(diào)試功能(當時也是歷盡萬難才測試成功的,還只是很簡單的混合ndk項目…)。 最近看到了ndk又更新到了r10b版本,而且又據(jù)說新版的Android Studio中已經(jīng)加入了一些ndk支持,于是正好一次測試一下(Android Studio beta 0.8.14, android-ndk32-r10b-windows-x86_64): 最初想到的用Android Studio和NDK的方式是單獨編譯鏈接JNI部分代碼,然后將生成的so想辦法在Android Studio的gradle生成系統(tǒng)中加入進去,這樣就能完成最JNI操作,后來發(fā)現(xiàn)Android Studio項目中的app.iml文件中有這樣一句:
發(fā)現(xiàn)現(xiàn)在的版本應該是支持管理NDK部分代碼的,于是直接將jni部分代碼復制到app\src\main\jni下,執(zhí)行生成項目操作,得到錯誤提示:
不難看出,默認情況下,存在src/main/jni文件夾時,gradle生成腳本會執(zhí)行ndk編譯生成操作,但是,編譯生成方式并不是像以前那樣用ndk-build去處理Android.mk Application.mk等做c/c++代碼的編譯鏈接,而是在臨時文件路徑中重新生成了一份帶有jni文件夾中所有文件絕對路徑的mk文件,并以此作為ndk編譯項目,姑且不說生成mk中的參數(shù)是否正確,單就是一個絕對路徑問題就導致了上面提示的錯誤,明顯mk中的source沒有被正確找到(據(jù)說新版ndk是可以識別絕對路徑的,不過我這還是沒試驗成功),然后參考最后給出的stackoverflow問答,發(fā)現(xiàn)可以通過在app的build.gradle中加入配置:
的方式來屏蔽掉默認的jni編譯生成過程,這樣執(zhí)行g(shù)radle生成時就不會再處理jni中的原生代碼,而由手動調(diào)用ndk-build方式去生成so動態(tài)鏈接庫,同時下面的jniLibs.srcDir重定位生成庫文件夾為ndk-build默認生成的libs文件夾(這個默認是src/main/jniLibs,當然是默認生成jni腳本執(zhí)行成功的話,如果想保留不變的話也可以修改一下手動執(zhí)行ndk-build時的生成路徑),這時再調(diào)試運行就可以正確的嵌入native庫文件執(zhí)行了。最后stackoverflow的鏈接中還給出了額外配置整合到gradle腳本中的buildNative和cleanNative方法,隨IDE一起執(zhí)行自定義的生成操作,保證command line正確的話性質(zhì)是一樣的。 UPDATE1: 經(jīng)過上述設(shè)置之后雖然打包so到apk的過程沒有問題了,但是如果要進行ndk-gdb調(diào)試的話,還需要進入項目屬性中設(shè)置JNI調(diào)試選項(如下圖),否則會提示”ERROR: Non-debuggable application installed on the target device.Please re-install the debuggable version!”,也就是沒有將Debug需要的gdbserver及gdb.setup打入包內(nèi)。 |
|
來自: mediatv > 《安卓系統(tǒng)》