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 <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函數了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章