我想跟着《Android系统源代码情景分析》第2章,把从驱动到HAL到应用层做一遍,可是做到JNI层,只要调用了jniRegisterNativeMethods(...)函数注册接口列表,编译Android源码,启动emulator就停在启动界面,再也进不了系统了。代码如下:
// JAVA本地接口方法表
static const JNINativeMethod method_table[] = {
{"init_native", "()I", (void*)ha_init},
{"setValue_native", "(II)V", (void*)ha_setValue},
{"getValue_native", "(I)I", (void*)ha_getValue},
};
// 注册Java本地接口方法
int register_android_server_HAService(JNIEnv *env)
{
return jniRegisterNativeMethods(env, "com/android/server/HAService",
method_table, NELEM(method_table));
}
register_android_server_HAService(JNIEnv *env)
函数在frameworks/base/services/core/jni/onload.cpp
中被添加到JNI_OnLoad()
函数的尾部。
如果我把return jniRegisterNativeMethods(...)
这一行注掉,就能正常跑通,加上这一行,哪怕我把method_table[]中的元素全都删掉,emulator也总是走到启动界面,再也进不了系统了。
我的Android源码是6.0.1_r11,具体的步骤可参见:http://palanceli.com/2016/08/...
有没有高手遇到过这种情况呢?
学习是最好的投资!