欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

Android Studio NDK cpp读取so库文件

 

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

本文地址:https://blog.csdn.net/weixin_42513339/article/details/107177154