из Понимание веб-представления Android addjavascriptinterface : "Метод WebView.addJavascriptInterface отправляет сообщение экземпляру WebViewCore :
mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, аргумент); В WebViewCore.java есть куча перегруженных методов с именем sendMessage , но нам на самом деле не нужно знать, какой именно вызывается, поскольку они делают почти одно и то же. Есть даже приятный комментарий, который намекает нам, что мы находимся в правильном месте! Все они делегируют экземпляр EventHub, который является некоторым внутренним классом. Этот метод оказывается синхронизированным и отправляет сообщение экземпляру Handler, что является хорошим признаком того, что он, вероятно, выполняется в другом потоке, но для полноты картины давайте выясним!
Этот обработчик создается в EventHub.transferMessages, который вызывается из WebViewCore.initialize. Здесь есть еще несколько прыжков, но в конце концов я обнаружил, что это вызывается из run в WebCoreThread (подкласс Runnable), который создается вместе с новым потоком прямо здесь.
synchronized (WebViewCore.class) {
if (sWebCoreHandler == null) {
// Create a global thread and start it.
Thread t = new Thread(new WebCoreThread());
t.setName(THREAD_NAME);
t.start();
try {
WebViewCore.class.wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for thread " +
"creation.");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
}
}
Другими словами, это может быть цепочка вызовов, на мой взгляд:
android.webkit.WebViewClassic
4159 @Override
4160 public void More ...addJavascriptInterface(Object object, String name) {
4161
4162 if (object == null) {
4163 return;
4164 }
4165 WebViewCore.JSInterfaceData arg = new WebViewCore.JSInterfaceData();
4166
4167 arg.mObject = object;
4168 arg.mInterfaceName = name;
4169
4170 // starting with JELLY_BEAN_MR1, annotations are mandatory for enabling access to
4171 // methods that are accessible from JS.
4172 if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
4173 arg.mRequireAnnotation = true;
4174 } else {
4175 arg.mRequireAnnotation = false;
4176 }
4177 mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, arg);
4178 }
android.webkit.WebViewCore
static class JSInterfaceData {
827 Object mObject;
828 String mInterfaceName;
829 boolean mRequireAnnotation;
830 }
java.lang.Объект
37 public class Object {
38
39 private static native void registerNatives();
40 static {
41 registerNatives();
42 }
Возвращает класс времени выполнения этого объекта. Возвращенный объект класса — это объект, заблокированный статическими синхронизированными методами представляемого класса. Фактический тип результата — Class, где |X| является стиранием статического типа выражения, для которого вызывается getClass. Например, в этом фрагменте кода приведение не требуется:
Number n = 0;
Class<? extends Number> c = n.getClass();
Возвращает: объект класса, который представляет класс среды выполнения этого объекта. См. Также: Спецификация языка Java, третье издание (15.8.2 Литералы классов)
64
65 public final native Class<?> getClass();
С точки зрения Dalvik, я думаю, вы просто регистрируете обратный вызов JNI через findClass, подобный этому, из JNIHelp.c :
/*
* Register native JNI-callable methods.
*
* "className" looks like "java/lang/String".
*/
int jniRegisterNativeMethods(JNIEnv* env, const char* className,
const JNINativeMethod* gMethods, int numMethods)
{
jclass clazz;
LOGV("Registering %s natives\n", className);
clazz = (*env)->FindClass(env, className);
if (clazz == NULL) {
LOGE("Native registration unable to find class '%s', aborting\n",
className);
abort();
}
if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {
LOGE("RegisterNatives failed for '%s', aborting\n", className);
abort();
}
(*env)->DeleteLocalRef(env, clazz);
return 0;
}
В заключение моя идея взята из родных библиотек:
//Get jclass with env->FindClass
так что, возможно, вместо getClass можно использовать FindClass...
person
Community
schedule
30.09.2013
getClass()
, если только я не настрою исходный код Android, прикрепленный к Eclipse (что возможно, просто мне не нужно возиться с этим). Установка точки останова в другом месте может привести меня к тому, где этот материал находится в коде, но не даст прямого ответа. Хорошие идеи, хотя - я попробую это сегодня. - person CommonsWare   schedule 27.09.2013