在jni中調用第三方so里的方法

1、在app\libs中增加對應的so

2、在build.gradle中增加

externalNativeBuild {

? ? cmake {

? ? ? ? path file('src/main/cpp/CMakeLists.txt')

? ? }

}

sourceSets {

? ? main {

? ? ? ? jniLibs.srcDirs = ["libs"]

? ? }

}

3、CMakeList.txt文件

cmake_minimum_required(VERSION 3.22.1)

project("test")

add_library(test SHARED

? ? ? ? layer3/Layer3.cpp

? ? ? ? )

find_library( log-lib log )

target_link_libraries(test ${log-lib})

include_directories(./include)

4、在include下包含對應的頭文件

5、Layer3.cpp

#include <dlfcn.h>

#include <pthread.h>

#include <android/log.h>

#include <jni.h>

#define SO_PATH? ? "libother.so"

#define? LOGE(...)? __android_log_print(ANDROID_LOG_ERROR,"lmy",__VA_ARGS__)

#define? LOGI(...)? __android_log_print(ANDROID_LOG_INFO,"lmy",__VA_ARGS__)


typedef ULONG (*Test_f)(const char *name);

typedef struct {

? ? Test_f? TestFn;

} ApiTable;

static ApiTable g_ApiTable;

static void *g_libHandle = NULL;

static pthread_mutex_t g_libHandleLock = PTHREAD_MUTEX_INITIALIZER;

static ULONG GetBasicApiSymbol(ApiTable *ApiTable) {

? ? ApiTable->TestFn = (Test_f) (dlsym(g_libHandle, "TEST"));

? ? if (ApiTable->TestFn == NULL) {

? ? ? ? LOGE("get symbol TEST failed\n");

? ? ? ? return 0xFFFF0000;

? ? }

? ? return 0;

}

static ULONG GetApiSymbol() {

? ? ApiTable apiTable = {0};

? ? (void)pthread_mutex_lock(&g_libHandleLock);

? ? g_libHandle = dlopen(SO_PATH, RTLD_LAZY);


? ? if (g_libHandle?== NULL) {

? ? ? ? (void) pthread_mutex_unlock(&g_libHandleLock);

? ? ? ? return 1;

? ? }

? ? if (GetBasicApiSymbol(&apiTable?) != 0) {

? ? ? ? LOGE("get symbol failed\n");

? ? ? ? goto ERROR;

? ? }


? ? g_ApiTable = apiTable?;


? ? (void) pthread_mutex_unlock(&g_libHandleLock);

? ? return 0;

? ? ERROR:

? ? dlclose(g_libHandle);

? ? g_libHandle = NULL;

? ? (void) pthread_mutex_unlock(&g_libHandleLock);

? ? return 0xFFFF0000;

}

extern "C" JNIEXPORT long JNICALL

? ? ? ? Java_com_xxx_Native_init(JNIEnv

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *env,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? jobject instance){

? ? GetApiSymbol();

? ? ULONG? re =g_ApiTable.TestFn("hello world");

? ? LOGI("0x%x",re);

? ? return re;

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容