Android Studio中進行Jni編程

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類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章