Таблица функций JNI - реализация функций в исходном коде Dalvik - PullRequest
0 голосов
/ 20 августа 2011

Я пытаюсь найти точку входа в цикл интерпретатора Дальвика.

Я прочитал загрузочный код Android (2.1 froyo) до того момента, когда вызывается env-> CallStaticVoidMethod (). Это означает «начать запуск метода статической пустоты JAVA в Dalvik». В моем случае указанный метод является основным методом ZygoteInit.

Однако нигде в коде я не могу найти реализацию c / cpp этого метода ввода ("CallStaticVoidMethod") - только ссылки и объявления.

То же самое относится ко всем остальным точкам входа интерпретатора - CallObjectMethod, CallBooleanMethod и т. Д ...

В файле dalvik / vm / Jni.c исходного кода есть глобальная переменная gNativeInterface, которая содержит указатели на все эти функции. Он инициализируется символами, которые я не могу найти определения (я подозреваю, это потому, что для их определения использовался какой-то макрос).

Спасибо заранее всем ответчикам.

1 Ответ

2 голосов
/ 20 августа 2011

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 / интерполяция / Stack.c

...