Android NativeActivity中无法获取MessagePayloadJni类引用的解决方法咨询
解决NativeActivity中获取
MessagePayloadJni类引用的问题 问题根源
org.chromium.content.browser.MessagePayloadJni是Chromium自动生成的JNI绑定类,这类类属于WebView的私有内部实现,不会被系统默认类加载器扫描到,直接调用FindClass自然会抛出ClassNotFoundException。
可行解决方案
1. 通过已持有的MessagePayload实例的类加载器加载
既然你已经拿到了MessagePayload的JNI对象,可借助它的类加载器来加载目标JNI绑定类,代码示例:
// 假设msgPayload是你已获取的org.chromium.content_public.browser.MessagePayload实例 jclass msgPayloadCls = env->GetObjectClass(msgPayload); jmethodID getClassLoaderMethod = env->GetMethodID(msgPayloadCls, "getClassLoader", "()Ljava/lang/ClassLoader;"); jclass classLoaderCls = env->FindClass("java/lang/ClassLoader"); jmethodID loadClassMethod = env->GetMethodID(classLoaderCls, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); // 用MessagePayload的类加载器加载JNI绑定类 jstring jniClassName = env->NewStringUTF("org.chromium.content.browser.MessagePayloadJni"); jclass msgPayloadJniCls = (jclass)env->CallObjectMethod( env->CallObjectMethod(msgPayload, getClassLoaderMethod), loadClassMethod, jniClassName ); // 调用getAsString方法 if (msgPayloadJniCls != nullptr) { jmethodID getAsStringMethod = env->GetStaticMethodID( msgPayloadJniCls, "getAsString", "(Lorg/chromium/content_public/browser/MessagePayload;)Ljava/lang/String;" ); jstring payloadStr = (jstring)env->CallStaticObjectMethod(msgPayloadJniCls, getAsStringMethod, msgPayload); // 处理获取到的字符串... } // 释放局部引用 env->DeleteLocalRef(msgPayloadCls); env->DeleteLocalRef(classLoaderCls); env->DeleteLocalRef(jniClassName); env->DeleteLocalRef(msgPayloadJniCls);
2. 直接调用MessagePayload的实例方法(更可靠)
Chromium的MessagePayload本身暴露了获取内容的公共Java方法,完全可以绕开自动生成的JNI绑定类,直接调用实例方法:
jclass msgPayloadCls = env->GetObjectClass(msgPayload); jmethodID getAsStringMethod = env->GetMethodID(msgPayloadCls, "getAsString", "()Ljava/lang/String;"); if (getAsStringMethod != nullptr) { jstring payloadStr = (jstring)env->CallObjectMethod(msgPayload, getAsStringMethod); // 处理字符串... } env->DeleteLocalRef(msgPayloadCls);
注:这种方式更稳定,因为自动生成的JNI绑定类的包名、方法签名可能随WebView版本变动,而
MessagePayload的公共方法兼容性更强。
3. 确保WebView初始化完成后再执行操作
Chromium相关类只有在WebView库完成加载后才会被类加载器识别,如果你在WebView初始化前调用类查找逻辑,必然会失败,需调整代码执行时机。
内容的提问来源于stack exchange,提问作者Charles Lohr
相关产品推荐
相关产品推荐

