我在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来请求服务。