天天看點

使用AndroidStudio編譯NDK的方法及錯誤解決方案

參考資料:

實踐證明:

0.4.2隻有在gradle1.10版本下建立隻包含AndroidLibrary子產品的工程時才能正常編譯,gradle1.9版本不可以。

0.4.6使用gradle1.10可以。

0.5.0無論是gradle1.10還是gradle1.11版本都可以生成so庫。

0.5.5的不能編譯NDK,無論是gradle1.10還是gradle1.11版本都不能生成so庫,屙血尿膿。

下載下傳AndroidStudio:

下載下傳NDK:

下載下傳gradle:

建立項目:

運作AndroidStudio後,建立新項目,新項目會有一個預設的Module,這裡項目名稱為JNIDemo,Module為app。

然後通過向導完成項目的建立。

AndroidStudio還是非常慢的,長時間處于這種狀态:

經過漫長的等待後終于完成項目的建立,然後在這個項目下建立一個Module,New Module->Android Library:

不勾選“Create activity”然後點選“Finish”完成建立,此時項目結構如圖:

app和hellojni均為JNIDemo下的兩個Module,這裡把hellojni作為生成so庫的NDK開發層,把app作為調用so庫的APK引用開發層。

在hellojni子產品的src/main下建立jni目錄,并在jni目錄下建立檔案main.cpp,代碼如下:

這裡隻導出一個msg函數列印傳遞進來的字元串,僅作測試。再在jni目錄下建立一個empty.cpp檔案,内容為空,這個是為了解決NDK的bug所作的,以防編譯出錯。

打開local.properties,設定正确的SDK路徑和NDK路徑:

打開項目gradle/wrapper目錄下的gradle-wrapper.properties檔案,修改:

為:

并打開項目根目錄下的build.gradle檔案,修改:

為(指定使用gradle1.10則修改為0.9.+,指定使用gradle1.11則修改為0.9.2):

如果配置的是0.7.+則預設使用gradle1.9,如果設定為0.9.+則預設使用gradle1.10。

另外還需要注意的是gradle1.9下沒有buildTypes标簽,需要将debug、release标簽直接放在android标簽内,在gradle1.10下debug、release需要放在buildTypes标簽内,buildTypes在android内。這裡hellojni配置的build.gradle檔案内容如下:

然後選擇hellojni項目右鍵“Make Module hellojni”,等待一段時間後會在項目下生成build-ndk目錄,目錄下會有一些不同版本的so庫檔案生成,如圖:

注意這裡的Android.mk檔案每次編譯都會重新由工具自動生成,而非手動編輯的,我覺得這一點設計就比較差勁。例如如果想要使用log輸出函數__android_log_print,需要添加“LOCAL_LDLIBS :=  -llog”,則在build.gradle檔案中添加如下的配置:

由gradle根據配置再去生成Android.mk檔案,最後再調用ndk進行編譯。

右鍵工程選擇Open Module Settings,選擇Modules-app,打開Dependencies頁籤點選“+”号,選擇Module dependency,在打開的對話框中選擇hellojni。

但是測試發現設定依賴沒有效果,如果直接編譯app,hellojni并沒有編譯,仍需要手動編譯hellojni。

調用native函數:

app項目中,在MainActivity類中聲明native函數:

并添加靜态代碼加載hellojni庫:

在MainActivity::onCreate中調用native函數列印一句log:

還需要将hellojni生成的so庫檔案打包進apk,仍需要配置build.gradle檔案,添加:

其中copyNativeLibs任務是從相對app的項目路徑'../hellojni/build/ndk/arm/debug/lib'下複制所有armeabi子目錄的so檔案到本項目build目錄下的lib目錄中,執行效果:

這樣最後打包生成的apk包才會包含有hellojni的so庫檔案。

測試:

編譯運作app,apk安裝完畢運作時輸出log資訊:

後面列出了可能出現的gradle錯誤以及解決方案,以供參考。

錯誤:

解決方案:

這是NDK在Windows下一個bug,當隻編譯一個檔案時出現,解決方法就是再添加一個空的檔案即可。

這個Build Tools是指“Android SDK Build-tools”,打開SDK Manager勾選相應版本(例如這裡是19.0.3)安裝即可。

在android { }中添加:

若有類似錯誤可以參考加入相應的标簽:

在使用gradle1.9版本時遇到,使用gradle1.10版本來解決。

但是如果我們使用gradle1.9版本的話又會出現錯誤:

無論使用哪個版本都有問題,後來仔細檢視了下'AppPlugin'這個錯誤是出現在‘app’子產品上的而非‘hellojni’子產品上,于是考慮建立工程項目并且隻在該工程下建立一個庫子產品,不再建立app子產品,如圖:

這裡不勾選“Create custom launcher icon”和“Create activity”,直接finish完成,其他配置參考前述,最後編譯後可以生成so庫檔案:

這個錯誤忘記記錄了囧

File-Settings-Gradle-Gradle VM options:-Xmx512m