You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:15:05