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

发布于 2024-11-30 14:12:07 字数 456 浏览 0 评论 0原文

我正在尝试找到 Dalvik 解释器循环的入口点。

我已经阅读了 Android (2.1 froyo) 启动代码,直到调用“env->CallStaticVoidMethod()”。这意味着“在 Dalvik 中开始运行 JAVA static void 方法”。就我而言,指定的方法是 ZygoteInit 的 main 方法。

但是,我在代码中的任何地方都找不到此入口方法(“CallStaticVoidMethod”)的 c/cpp 实现 - 只有引用和声明。

这同样适用于所有其他解释器入口点 - CallObjectMethod、CallBooleanMethod 等。

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

首先感谢所有回复者。

I'm trying to find the entry point to Dalvik's interperter loop.

I've read the Android (2.1 froyo) boot-up code up to the point where "env->CallStaticVoidMethod()" is called. This means "start running a JAVA static void method in Dalvik". In my case the specified method is the ZygoteInit's main method.

However, I cannot find the c/cpp implementation of this entry method ("CallStaticVoidMethod") anywhere in the code - only references and declerations.

The same goes to all of the other interpreter entry points - CallObjectMethod, CallBooleanMethod, etc...

In the file dalvik/vm/Jni.c of the source code, there is a global variable gNativeInterface which holds pointers to all of these functions. It is initialized with symbols that I cannot find the definitions of (I suspect this is because some Macro was used to define them).

Thanks up front to all repliers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆依然 2024-12-07 14:12:07

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

CallStaticVoidMethod() is implemented via a macro in dalvik/vm/Jni.c
(a header file first maps CallStaticVoidMethod to 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 is implemented in davlik/vm/interp/Stack.c

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文