[Android ]JNI 入門踩坑

你們好,我係蒼王。
html

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表android


好久之前玩了一下NDK的編譯,那時候仍是Eclipse時代。架構

如今都換成Android studio時代,固然就要換新工具啦。app

普通的配置的方法,太多文章作基礎配置的介紹了,我這裏就不重複介紹。工具

史上最詳細Android Studio + NDK範例
組件化


說一下踩坑當中遇到的問題吧。學習

(1)ndk的配置gradle

ndk命令的環境配置,一開始想一想以爲很簡單。3d

可是當手寫屢次都有問題以後,最後仍是使用複製粘貼其餘環境變量的(特別是符號大小寫的問題)



(2)低版本的NDK編譯問題

NDK編譯版本太低的時候會提示這個


網上不少資料都是在gradle.properties中添加一個Android.useDeprecatedNdk=true,

然而這樣仍是沒法解決問題的。。。

其實這裏必定要用android.useDeprecatedNdk=true(android必定要小寫。)


(3)指定資源文件

網上都是指定這樣的資源文件,你又理解這兩個參數所表達的意思嗎?


jni.srcDirs指的是須要編譯的xx.c文件的地址

jniLibs.srcDir指的引用的xx.so文件的地址

若是你按上圖這樣填,你絕對會被坑死。。。編譯出來連NDK的文件夾都不會出現。


jni.srcDirs=[]是不可行的,必定要指定好c文件的路徑


對應的目錄地址必定要有xx.c的文件


這樣才能生成ndk的文件夾,ndk文件裏面纔是生成so文件,用於apk中jni的運行。


到達這裏你編譯app的時候,就會將so的文件放到你apk的lib文件夾裏面


apk結構

(4)開發中須要注意的是

類型轉換,是真的要了解清楚,如今類型轉換都已經比較智能了,只須要在前面加個jxxx(xxx爲java數據類型)就是轉換的類型了。


(5)Android studio沒法調試JNI裏面的代碼,其斷點是無效的,因此必要的時候,必定要將必要參數打log

這裏提供打log封裝的方法,須要引用android/log.h的庫,而後用define定義__android_log_print的打印方法。其參數和等級很容易在方法中辨認。


調用起來也很是簡單,只須要使用上面的方法


調試臺打log


(6)庫引用相關

假若xxx.c文件和對應的引用的xxx.h文件放到同一個文件夾裏面


無需在c文件裏面編寫include h的頭文件就可使用h中定義的方法。


(7)Android生命週期產生的問題。

Java調用c的,須要jni提供接口就能夠調用了。

c調用java的狀況,通常是須要c使用反射的方法,建立相關對象和方法,而後填入方法參數調用的。

可是有個問題,由於Android的Activity和Fragment,Service等,其擁有生命週期的特殊性,咱們沒法直接反射生成一些須要持有上下文context的方法。那咱們須要如何處理呢?

這裏須要代表一下,咱們每一個JNI的方法都有兩個變量

JNIEnv是上下文,jobject是調用這個方法的對象


那麼調用Activity的方法,就利用jobj這個對象來調用方法便可。這裏方法調用的方法本身仍是查一下(jni.h和jni接口說明文檔吧)


暫時踩坑狀況就到這裏。

***2017.3.15*****

羣內有同窗反映有其餘問題,若是使用高版本的Android SDK編譯後,若是切換到低版本的SDK例如(25->23)會出現崩潰的問題。



這是個開端,以後會繼續深刻給你們介紹JNI的內容。

敬請期待下期內容吧!!!

我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。

羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索