天天看點

Android Studio的JNI開發快餐教程Android Studio的JNI開發快餐教程

從eclipse換到android studio之後,原來的ndk內建已經不能用了。同時,androidstudio也是在快速疊代進步中,不僅支援内置的ndk支援插件,還有支援外部編譯系統的plugin. 而且這還是在實驗中的結果,在不久的将來,還可能有更新的變化。不過,萬變不離其宗,我們打好基礎,形式上的東西跟着android studio變就好。

首先說明,既然是android studio認為它已經過時了,是以我們需要在gradle.properties中聲明一下我們還堅持用這個屬性:

下面我們看下,在build.gradle中如何使用這種老式的辦法:

這其中使用的plugin,是"com.android.application".

我們現在可以開始寫一個類測試一下:

編譯之後,使用javah工具生成頭檔案com_yunos_xulun_testcppjni_testcppjni.h:

然後我們寫一個c++函數去實作它:

将頭檔案和cpp檔案放到app/src/main/jni下面。

在android工程中寫個類去引用這個本地方法,就不多說了。編譯運作,就生成了libtestcppjni.so。

還可以額外多設幾個屬性,比如編譯選項,比如生成什麼架構的庫,引入什麼庫等等:

其實,新的實驗性編譯系統,對于java的編譯也是變了不少。

下面,我們follow步驟去更新到新的編譯系統:

首先,要確定gradle的版本在2.10以上,我們通過修改gradle/wrapper下的gradle-wrapper.properties中的distributionurl來實作這一點。

我們修改build.gradle,從正式版改成實驗版,在我寫這篇檔案時,最新版本是0.8.0-alpah5。我們保守點,選個不帶alpha的0.7.2:

經過上一步的修改,系統已經提示,無法找到我們之前用的"com.android.application"的包名了,是以我們要針對新的'com.android.model.applicaiton’包進行修改:

針對ndk部分,modulename部分不用變。但是像cppflags和ldlibs現在要通過add方法來進行添加了。

我們還可以加上調試和stl的支援:

上面這兩種方式還不算完,生命不息,折騰不止,讓我們一起跟随android studio繼續折騰。

從2.2版本開始,android studio開始在64位os上支援

這次我們直接調用ndk去build。

之前我們一直沒有寫android.mk,現在要用ndk了,就寫一個吧:

application.mk也寫個吧:

然後改build.gradle:

從目前的情況看,可以繼續用過時的老方法,因為後兩種都還沒有正式釋出。

有興趣的可以跟進新的編譯系統,更新到2.2之後,也可以考慮使用externalnativebuild。