在 JNI 中访问 MessagePayloadJni 类

Acessing MessagePayloadJni class in JNI

提问人:Charles Lohr 提问时间:7/19/2023 更新时间:7/26/2023 访问量:14

问:

我的 Android NativeActivity 中有一个对象,用于生成 WebView,然后通过 Looper 消息手动处理。org.chromium.content_public.browser.MessagePayload

我正在尝试获取它的内容,但从我可以告诉的一些不同地方来看,我需要使用 的静态方法来获取有效负载的字符串。MessagePayloadJnigetAsString

但是,我似乎不能,因为它返回一个.FindClass("org/chromium/content/browser/MessagePayloadJni")java.lang.ClassNotFoundException

我应该使用其他机制从 NativeActivity 获取类引用吗?MessagePayloadJni

Android WebView java-native-interface chromium native-activity

评论


答:

0赞 Charles Lohr 7/26/2023 #1

这并不难。您可以使用反射来获取字段成员,结果发现它只是混淆了类名属性。在某些版本的 Android 中,您可以访问 和 for 字段 和 for 字段,但是,您必须再退一步,然后才能访问 Object 的字节数组。bStringcbyte[]MessagePayloadMessagePayload

无论如何,虽然类成员是公开的,但 Android 会混淆成员的名称,但您仍然可以手动内省对象,并在其中获取 WebMessage 的有效负载。

这使得专门使用 JNI 与 WebMessages 进行交互成为可能,请参阅以下代码,该代码创建循环器并在不调用的情况下拦截数据: https://github.com/cnlohr/rawdrawandroid/blob/a77293aadb95f59cb3c2e8987bc976c06bee5a65/test.c#L317-L418looper.loop()