你們好,我係蒼王。
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文件夾裏面
(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,也能夠掃碼進羣。我在這裏期待大家的加入!!!