为什么JNIEnv找不到类com/google/android/gms/ads/identifier/AdvertisingIdClient?



我在Instrumentation.callApplicationOnCreate中尝试env->FindClass("com/google/android/gms/ads/identifier/AdvertisingIdClient"),它返回NULL。

我发现了常见问题:为什么FindClass没有找到我的类?上面写着:

如果从这个线程调用FindClass, JavaVM将在"系统"中启动。类装入器而不是与应用程序关联的类装入器,因此尝试查找特定于应用程序的类将失败。

我也试过这个在Instrumentation.callActivityOnCreate,但仍然没有找到它。

jclass class_Activity = env->FindClass("android/app/Activity");
jclass refClass_Activity = (jclass)env->NewGlobalRef(class_Activity);
jmethodID method_getClassLoader = env->GetMethodID(refClass_Activity, "getClassLoader", "()Ljava/lang/ClassLoader;");
jobject classLoaderObj = env->CallObjectMethod(thisAct, method_getClassLoader);
jclass class_ClassLoader = env->FindClass("java/lang/ClassLoader");
jclass refClass_ClassLoader = (jclass)env->NewGlobalRef(class_ClassLoader);
jmethodID method_findClass = env->GetMethodID(refClass_ClassLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
jclass class_AdvertisingIdClient_Info = static_cast<jclass>(env->CallObjectMethod(classLoaderObj, method_findClass, env->NewStringUTF("com/google/android/gms/ads/identifier/AdvertisingIdClient")));
LOGI("class_AdvertisingIdClient_Info= %p", class_AdvertisingIdClient_Info);

我不知道env->FindClass属于"系统";类装入器或应用程序类装入器。如何找到类AdvertisingIdClient?

在前两个调用中,您使用JNI函数来查找类。他们期望类名的组件用"/"分隔。然而,最后一个"findclass"是对ClassLoader对象中的Java方法的调用。这需要";作为分隔符。

问题解决了

Application ClassLoader对于我的自定义类工作得很好。

因为App没有包含com/google/android/gms/ads/identifier/AdvertisingIdClient。所以我们找不到它。通常我们通过Intent获取advertisingId来请求服务。

相关内容

最新更新