// 测试用 动态获取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);
}