android 获取JNIEnv的几种方法.md
个人目前三种方法:
- 通过JNI_OnLoad
- 通过android::AndroidRuntime::getJNIEnv()
- 通过dlopen和dlsym 拿到“android::AndroidRuntime::getJNIEnv()”函数指针然后调用该函数
注意:第二种要对Ndk进行patch,github上搜索 ndk-patch 进行修改
做个简单的实验:
JNIEnv*(*getAndroidRuntimeEnv)();
JNIEnv* dlsmgetenv()
{
void*runtime = dlopen("/system/lib/libandroid_runtime.so", RTLD_NOW);
getAndroidRuntimeEnv= (JNIEnv*(*)())dlsym(runtime, "_ZN7android14AndroidRuntime9getJNIEnvEv");
return getAndroidRuntimeEnv();
}
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
{
return -1;
}
JNIEnv* AndroidRuntimeenv = android::AndroidRuntime::getJNIEnv();
JNIEnv* dlsymenv = dlsmgetenv();
Messageprint::printinfo("JNI_OnLoad", "JNI_OnLoadenv %p AndroidRuntimeenv:%p dlsymenv:%p", env, AndroidRuntimeenv, dlsymenv);
return JNI_VERSION_1_4;
}
打印结果:
I/JNI_OnLoad: JNI_OnLoadenv 0xb9115830 AndroidRuntimeenv:0xb9115830 dlsymenv:0xb9115830
可以看到拿到的时同一个地址
多线程没测试,可能存在问题。