Android JNI子线程中通过Env.findClass()查找自定义Java类失败的解决方法

问题:
在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,仅供参考!

猜你喜欢

转载自blog.csdn.net/u010116586/article/details/107164099