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

why JNIEnv can't find class com/google/android/gms/ads/identifier/AdvertisingIdClient?

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

我找到了 FAQ: Why didn't FindClass find my class?,上面写着:

If you call FindClass from this thread, the JavaVM will start in the "system" class loader instead of the one associated with your application, so attempts to find app-specific classes will fail.

我也在 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 是属于“系统”class 加载器还是应用程序 class 加载器。如何找到 class AdvertisingIdClient?

在前两个调用中,您使用 JNI 函数查找 classes。他们希望 class 名称的组成部分由“/”分隔。但是,最后一个“findClass”是对 ClassLoader 对象中的 Java 方法的调用。这需要“。”作为分隔符。

问题已解决。

应用程序 ClassLoader 适用于我的自定义 Class。

因为应用程序未包含 com/google/android/gms/ads/identifier/AdvertisingIdClient。所以我们找不到它。通常我们通过Intent获取advertisingId来请求Service.