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

可以看到拿到的時同一個地址
多線程沒測試,可能存在問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM