做了一個demo,在此記錄下:
1.首先需要Android Studio新建NDK C++工程;
2.修改地方:
build.gradle
android {
//省略部分代碼
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "x86_64"
arguments '-DANDROID_PLATFORM=android-29',
"-DANDROID_STL=c++_shared"
}
}
}
//省略部分,以下爲添加,爲了加載lib文件夾內so庫
sourceSets {
main{
jniLibs.srcDirs=['libs']
}
}
}
java相關接口:
public native int testFromJNI(int t1,int t2);
cpp接口:
#include <jni.h>
#include <dlfcn.h>
extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapplication0707_MainActivity_testFromJNI(
JNIEnv *env,
jobject /* this */, jint t1, jint t2) {
int a = 0;
void *handle = dlopen("libTest0706.so", RTLD_LAZY);
if (handle != NULL) {
typedef int (*add_t)(int a, int b);
add_t add = (add_t) dlsym(handle, "add");
if(add != NULL){
a = add(t1,t2);
}
}
return a;
}
libTest0706.so
libTest0706.so庫內test0706.cpp,這裏so庫架構需要跟Android Studio內部指定生成的架構一致,api-level一致,而且需要利用NDK交叉工具鏈編譯生成,否則會發生衝突或者undefined reference(可用Android Studio直接生成,或者CMake+Ninja+引入NDK工具鏈)
extern "C"{
int add(int a, int b) {
return a + b;
}
}
然後把so庫放入libs/"架構" 文件夾下,這裏看自身對應的架構
這樣運行便可以調用add函數了