2011-08-20 77 views
0

我试图找到Dalvik的interperter循环的入口点。JNI函数表 - 函数在Dalvik源代码中的实现

我读过Android(2.1 froyo)启动代码,直到调用“env-> CallStaticVoidMethod()”为止。这意味着“开始在Dalvik中运行JAVA静态无效方法”。在我的情况下,指定的方法是ZygoteInit的主要方法。

但是,我无法在代码中的任何位置找到此入口方法(“CallStaticVoidMethod”)的c/cpp实现 - 仅引用和删除。

也是一样的所有其他解释切入点 - CallObjectMethod,CallBooleanMethod等..

在文件的Dalvik的源代码/ VM/Jni.c,有一个全局变量gNativeInterface这持有指向所有这些功能的指针。它用符号初始化,我找不到(我怀疑这是因为一些宏被用来定义它们)的定义。

非常感谢所有的回复者。

回答

2

CallStaticVoidMethod()在dalvik/vm/Jni.c 经由宏实现(一个标题文件第一映射CallStaticVoidMethod到CallStaticVoideMethodV)

2893 /* 
2894 * Call a static method. 
2895 */ 
2896 #define CALL_STATIC(_ctype, _jname, _retfail, _retok, _isref)    \ 

2912  static _ctype CallStatic##_jname##MethodV(JNIEnv* env, jclass jclazz, \ 
2913   jmethodID methodID, va_list args)         \ 
2914  {                  \ 
2915   UNUSED_PARAMETER(jclazz);           \ 
2916   JNI_ENTER();              \ 
2917   JValue result;              \ 
2918   dvmCallMethodV(_self, (Method*)methodID, NULL, true, &result, args);\ 
2919   if (_isref && !dvmCheckException(_self))       \ 
2920    result.l = addLocalReference(env, result.l);     \ 
2921   JNI_EXIT();               \ 
2922   return _retok;              \ 
2923  }                  

2945 CALL_STATIC(void, Void, , , false); 

dvmCallMethodV在davlik/vm/interp/Stack.c

+0

正是实现。谢谢! –