通过dlopen和dlsym加载so和运行里面的代码功能

// 测试用 动态获取so库的变量和执行so库的函数
extern "C"
JNIEXPORT jstring JNICALL
Java_com_xsh_opensltest_MyTest_stringFromSoVar(JNIEnv *env, jobject thiz,jstring path)
{
    const char* native_path = env->GetStringUTFChars(path, nullptr);
    char full_path[512];
    snprintf(full_path, sizeof(full_path), "%s/%s", native_path, "libstringfromso.so");

    void* handle = dlopen(full_path,RTLD_LAZY);
    //env->ReleaseStringUTFChars(path,native_path);
    if(!handle)
    {
        const char* error = dlerror();
        __android_log_print(ANDROID_LOG_ERROR,"StringFromSo","%s",error);
    }
    int* b = reinterpret_cast<int*>(dlsym(handle, "b"));
    __android_log_print(ANDROID_LOG_DEBUG, "JNI", "b: %d", *b);
    char** a_ptr = reinterpret_cast<char**>(dlsym(handle, "a"));
    const char* a_value = *a_ptr;
    __android_log_print(ANDROID_LOG_INFO, "JNI", "a: %s", a_value);

    typedef char* (*func)();
    func f = reinterpret_cast<func>(dlsym(handle,"methodFromSo"));
    if(!f)
    {
        const char* error = dlerror();
        __android_log_print(ANDROID_LOG_ERROR, "JNI", "dlsym error: %s", error);
    }
    const char* result = f();
    __android_log_print(ANDROID_LOG_INFO, "JNI", "Result: %s", result);
    /*typedef char* (*methodFromSo)(void);
    methodFromSo func =(methodFromSo)dlsym(handle,"methodFromSo");
    char* a = func();
    dlclose(handle);*/
    return env->NewStringUTF(result);

}

 

posted on 2025-06-03 15:55  小沙盒工作室  阅读(45)  评论(0)    收藏  举报