问题:
在Native层子线程中尝试获取自定义的Java类,发现总是提示找不到!!
代码如下:
if (gJavaVM->AttachCurrentThread(&pThreadJEnv, NULL) != JNI_OK)
{
LOGE("AttachCurrentThread failed.");
return;
}
jclass myTestClass= pThreadJEnv->FindClass("com/mytest/MyTestClass");
发现myTestClass一直返回NULL
在查看Jni本地多线程回调Java函数,env->findClass()失败找到了解决方法,但是这种解决方法需要改动的代码稍微优点多。
最近在查看Android 源码时,找到了另外一种,代码如下:
if (gJavaVM->AttachCurrentThread(&pThreadJEnv, NULL) != JNI_OK)
jclass tmpActivityClass = pThreadJEnv->FindClass("android/app/Activity");
jclass activityClass = (jclass)pThreadJEnv->NewGlobalRef(tmpActivityClass);
jmethodID getClassLoaderMethodId = pThreadJEnv->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
jobject classLoaderObj = pThreadJEnv->CallObjectMethod(gActivity, getClassLoaderMethodId);
jclass tmpClassLoaderClass = pThreadJEnv->FindClass("java/lang/ClassLoader");
jclass classLoader = (jclass)pThreadJEnv->NewGlobalRef(tmpClassLoaderClass);
jmethodID findClassMethodId = pThreadJEnv->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
//Get a reference to the MyTestClass class
//通过classloader 获取自定义类
jstring strClassName = pThreadJEnv->NewStringUTF("com/mytest/MyTestClass");
jclass tmpjavaMyTestClassClass = (jclass)pThreadJEnv->CallObjectMethod(classLoaderObj, findClassMethodId, strClassName);
jclass javaSXRCompositorClass = (jclass)pThreadJEnv->NewGlobalRef(tmpjavaSXRCompositorClass);
上边是通过classLoader来查找自定义类的。前提条件是:能够获取jobject activity这个变量,然后通过activity来获取classLoader,仅供参考!