1.介紹
Android程序分2層,java層與native層,java層編譯爲dex文件,native層編譯爲so動態庫。兩者使用jni(java native interface)來進行連接。
2.在Android Studio中進行Jni編程
2.1 Android Studio 中Jni環境搭建
Android Studio原生支持Jni編程,可以直接創建so庫,不過需要修改gradle文件以開啓Jni支持。
1.創建一個普通的Android項目
2.打開File->Project Structure,檢查NDK目錄是否正確,如果之前安裝了NDK,這裏會自動填上地址,如果沒有安裝,使用Android Studio中的SDK Manager進行下載。
還可以自己下載NDK包,解壓後將路徑填入Android NDK location。鏈接:https://pan.baidu.com/s/1Hoyt9q_kNWLe0ckiJ4mr_A
提取碼:nvdu
3.添加環境變量,新建名爲NDK_HOME的字段,值爲NDK的根目錄地址
再在Path中添加%NDK_HOME%\。
4.此時local.properties中應該有下圖中的一行地址,如果沒有,手動添加也可以
由於NDK版本和SDK可能不一致,編譯時可能會報警“Your project contains C++ files but it is not using a supported native build system”,所以先在gradle.properties文件下添加一行android.useDeprecatedNdk=true。
至此Android Studio下的Jni環境就搭建完畢了。
2.2 Android Studio下的Jni開發和使用
上節將NDK開發需要的環境搭建完畢了,現在可以生成一個.so庫,並使用它。
1.右鍵app,選擇New->Folder->Jni Folder,創建完後會生成一個jni目錄,裏面用來放c文件。
2.在MainActivity中聲明native方法
public native String sayHello();
3.在jni目錄中創建hello.c文件並實現native方法
#include <string.h>
#include <jni.h>
jstring Java_com_example_a42033_myapplication_MainActivity_sayHello(JNIEnv *env,jobject thiz){
return (*env)->NewStringUTF(env,"Hello from JNI !");
}
4.在build.gradle中加入moduleName,它將作爲.so庫的名字
5.代碼中調用
6.生成.so庫,點擊Build->Rebuild Project,會生成.so庫,生成的.so庫在\app\build\intermediates\ndk\debug\lib下
7.使用.so庫,Android Studio中.so包默認存放在main/jniLibs目錄下,不過一般情況下我們直接接.so庫放在app/libs目錄下面,首先將上圖紅框中所有平臺的.so文件一起拷貝到app.libs目錄下,然後在app/build.gradle中添加如下代碼:
此時可以將jni裏面的.c文件和build.gradle中的moduleName刪除,這不會影響程序的正常運行。
至此.so庫的編寫和使用都完成了。
2.3 額外的gradle配置
ndk{
moduleName = "hello"
ldLibs("log")//依賴庫
abiFilters("armeabi","armeabi-v7a","x86")//指定編譯平臺
stl =- "system"
cFlags("-std=c++11")
}
在AndroidStudio中進行Jni開發不需要編寫複雜的Android.mk,Application.mk等文件,這些完全可以在gradle中進行配置,具體可以參照gradle中的NdkOptions類。