JNI函数表 - 函数在Dalvik源代码中的实现

时间:2011-08-20 16:40:42

标签: android java-native-interface interpreter dalvik

我正试图找到Dalvik的interperter循环的入口点。

我已经阅读了Android(2.1 froyo)启动代码,直至调用“env-> CallStaticVoidMethod()”。这意味着“开始在Dalvik中运行JAVA静态void方法”。在我的例子中,指定的方法是ZygoteInit的主要方法。

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

所有其他解释器入口点也是如此 - CallObjectMethod,CallBooleanMethod等......

在源代码的文件dalvik / vm / Jni.c中,有一个全局变量gNativeInterface,它保存了指向所有这些函数的指针。它用符号初始化,我找不到定义(我怀疑这是因为使用了一些宏来定义它们)。

首先感谢所有回复者。

1 个答案:

答案 0 :(得分: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

中实施