2011-08-20 69 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

正是實現。謝謝! –