为什么 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.
我正在 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.