Android Studio NDK cpp读取so库文件
程序员文章站
2022-09-14 14:48:13
做了一个demo,在此记录下:1.首先需要Android Studio新建NDK C++工程;2.修改地方:build.gradleandroid { //省略部分代码 externalNativeBuild { cmake { cppFlags "" abiFilters "x86_64" arguments '-DANDROID_PLAT....
做了一个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函数了
本文地址:https://blog.csdn.net/weixin_42513339/article/details/107177154