gpt4 book ai didi

android - addJavascriptInterface() 是否依赖于 getClass()?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:51:04 24 4
gpt4 key购买 nike

我试图跟踪代码以查看 WebView 上的 addJavascriptInterface() 是如何实现的,但它深入到 native 代码中,这基本上削弱了我理解正在发生的事情的能力。

具体来说,我正在尝试确定 addJavascriptInterface() 安排回调 Java 代码的 JNI(?) 方式是否依赖于 getClass() 作为一部分反射策略的一部分,将 JavaScript 源代码中的方法引用映射到 Java 中的实现。我会假设它必须,并且maybe I am searching in the wrong place ,但我没有看到它。

谁能指出使用注入(inject)的 Java 对象的代码,以便我们了解它是如何实现的?

谢谢!


更新

澄清一下,我的意思是在传递给 addJavascriptInterface() 的对象上使用 getClass()

最佳答案

我认为您要查找的代码位于 external/webkit/Source/WebCore/bridge/jni/ 中。那里有两个主要的子目录,jscv8 代表 Android 使用的两个 Javascript 引擎。由于 V8 是最近使用了一段时间的引擎,我们将坚持使用它。

我假设您能够成功跟踪从 WebView.addJavascriptInterface()BrowserFrame.nativeAddJavaScriptInterface() 的代码的 Java 端,我将忽略这些细节。 native端由external/webkit/Source/WebKit/android/jni/WebCoreFrameBridge.cpp中的AddJavaScriptInterface()获取,这里是应用程序传入的Java对象最后使用 bindToWindowObject() 绑定(bind)到 WebKit 框架。

I am trying to determine if the JNI means by which addJavascriptInterface() arranges to call back into Java code relies upon getClass() as part of a reflection strategy

简短的回答是肯定的。它们在传统 JNI 代码周围使用了大量包装器,但如果您查看它们的内部,就会发现 JNIEnv 上用于进行反射的访问器。他们在 V8 中创建的包装器是:

external/webkit/Source/WebCore/bridge/jni/v8/JavaInstanceJobjectV8.cppexternal/webkit/Source/WebCore/bridge/jni/v8/JavaClassJobjectV8.cppexternal/webkit/Source/WebCore/bridge/jni/v8/JavaMethodJobjectV8.cpp

回到WebCoreFrameBridge.cpp,在绑定(bind)应用程序传入的那个对象之前,最初通过JNI传递给 native 代码的jobject被包裹在一个JavaInstance 类,然后转换为NPObject,这是绑定(bind)到WebKit 的最终对象。 V8 NPObject 的源代码位于:external/webkit/Source/WebCore/bridge/jni/v8/JavaNPObjectV8.cpp

我们可以在 NPObject 实现中看到调用总是提取 JavaInstance 并在那里调用方法。如果您查看 JavaNPObjectHasMethod()JavaNPObjectInvoke 等示例,您会注意到以下行经常出现:

实例->getClass()->methodsNamed(名称)

这将返回他们创建的 JavaClass 包装器,但是如果您查看 JavaClassJobjectV8 构造函数和相关方法,您会看到那些熟悉的对 Java 对象的反射调用使用 JNIEnv(包括对 Dalvik 的实际 JNI getClass() 调用)。

因此,当一个方法被绑定(bind)的 WebKit 框架调用时,它会找到关联的 NPObject,它会提取其 JavaInstance 包装器,后者又使用 JNI 反射来获取访问权限到 Java 方法。此处的监管链有点难以遵循,所以如果已经提供的内容足以回答您的问题,请告诉我。

关于android - addJavascriptInterface() 是否依赖于 getClass()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com