Android Studio NDK cpp读取so库文件

做了一个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 
#include 

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/"架构" 文件夹下,这里看自身对应的架构

Android Studio NDK cpp读取so库文件_第1张图片

 

这样运行便可以调用add函数了

你可能感兴趣的:(Android,交叉编译)