1.環境搭建
本教程基於AS3.4.2的,目前穩定版最新的。需要下載LLDB,NDK,CMake就行,下載完後as自動配置,所以比較簡單,只需要把上面幾個選線勾選上,單擊apply即可。
2 開始
2.1 創建項目工程
這個比較簡單,只需要創建一個空白的項目工程即可,要確保它是可以正常運行。
2.2 準備工作
- 創建一個純java類,Test.java
public class Test {
static {
System.loadLibrary("MyJni");//加載so的名稱
}
public native static String get();//方法
}
static塊是加載so包的,不用加後綴名。
這個Java類中的方法和c語言的方法是一一對應的,切勿寫錯了。把這個文件用java命令javac編譯成 .class 文件,這就需要使用javac命令來實現。
- 生成 .class 文件
javac java路徑
// 如:javac E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java
執行完後在同樣的目錄下出現一個.class 文件。(其實這一步也可以不單獨做,在獲取頭文件時,會自動編譯的)
- 生產 .h 頭文件
打開Android studio 下的terminal 控制檯,通過命令切換到main目錄下。
然後執行生成頭文件命令:
javac -encoding utf8 -h .\jni path
//javac命令 編碼 頭文件 保存路勁 編譯路勁
//如:javac -encoding utf8 -h .\jni E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java
執行成功後,在jni目錄下會看到 .h 文件(名字是自己命名好的)
2.3 編寫 .c 文件
- 新建 .c 文件
在Android studio 新建一個 .c 文件,如下圖,但是目錄一定要在jni目錄下,和 .h 放在一起。
- 碼程序
#include<jni.h>
#include<stdio.h>
#include "com_haochen_sopackagetest_Test.h"
JNIEXPORT jstring JNICALL Java_com_haochen_sopackagetest_Test_get
(JNIEnv *env, jclass jclass) {
return (*env)->NewStringUTF(env, "This is my first NDK Application,my name is navy");
}
具體裏面爲什麼這麼寫,這就涉及到NDK語法了。
- .mk 文件
這個文件目的是配置編譯路勁。
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyJni //so的名稱,必須要和配置文件以及類中名稱要一致。
LOCAL_LDFLAGS := -Wl
LOCAL_SRC_FILES := E:\AndroidProjects\SoPackageTest\app\src\main\jni\My.c// c 文件路勁
LOCAL_C_INCLUDES += E:\AndroidProjects\SoPackageTest\app\src\main\jni //include 文件
include $(BUILD_SHARED_LIBRARY)
右擊Android.mk->Link C++ Project with Gradle ,彈出Link C++ Project with Gradle 對話框,選擇 ndk-build 以及 Android.mk 路徑,點擊OK
- 配置build.gradle
在Android defaultconfig設置如下
ndk {
moduleName "MyJni"//so名稱
abiFilters 'arm64-v8a'//支持的so包的格式
}
在Android 下設置:
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
到此,配置算是完成,執行程序成功後,我們就能在下面目錄中找到so包。
值得注意的是:包名的要一致
編譯好的so可以拷到不同項目中用,若是需要不同平臺的so,只需要在build.gradle 中的ndk選項中設置不同平臺,編譯成功後,會有不同平臺的so包。