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

Com*_*are 6 android dalvik android-source android-webview

我试图通过代码来追踪,看看addJavascriptInterface()WebView实现的,但它潜入native代码,基本上戕害我神交是怎么回事能力.

具体来说,我试图确定JNI(?)是否意味着addJavascriptInterface()回调为Java代码的方式依赖于getClass()作为反射策略的一部分,将JavaScript源中的方法引用映射到Java中的实现.我会认为它必须,也许我在错误的地方搜索,但我没有看到它.

任何人都可以指向使用注入的Java对象的代码,所以我们可以看到它是如何实现的?

谢谢!


UPDATE

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

Dev*_*red 5

我认为你所追求的代码是在external/webkit/Source/WebCore/bridge/jni/.主要有两个子目录出现,jscv8表示两个JavaScript引擎的Android已经习惯了.由于V8是最近使用过的发动机,并且有一段时间了,我们会坚持这一点.

我假设你能够成功地跟踪代码的Java方面摆脱WebView.addJavascriptInterface()下来BrowserFrame.nativeAddJavaScriptInterface(),我将离开这些细节了.本机端由AddJavaScriptInterface()in 拾取external/webkit/Source/WebKit/android/jni/WebCoreFrameBridge.cpp,应用程序传入的Java对象最终绑定到WebKit框架bindToWindowObject().

我试图确定JNI是否意味着addJavascriptInterface()安排回调为Java代码依赖于getClass()作为反射策略的一部分

简短的回答是肯定的.他们在传统的JNI代码周围使用了很多包装器,但是如果你看一下它们里面就会出现JNIEnv用于反射的访问器.他们在V8中创建的包装器是:

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

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

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

instance->getClass()->methodsNamed(name)

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

因此,当绑定的WebKit框架调用方法时,它会找到关联的NPObject,它会提取其JavaInstance包装器,而后者又使用JNI反射来访问Java方法.这里的监管链有点难以理解,所以让我知道已经提供的东西是否足以回答你的问题.