android中jni的调用过程,android JNI学习② JNI调用过程

1.Android JNI调用过程

1.1 由Android系统加载的JNI

Android系统在启动启动过程中,先启动Kernel创建init进程,紧接着由init进程fork第一个横穿Java和C/C++的进程,即Zygote进程。Zygote启动过程中会AndroidRuntime.cpp中的startVm创建虚拟机,VM创建完成后,紧接着调用startReg完成虚拟机中的JNI方法注册。

在AndroidRuntime.cpp中:

int AndroidRuntime::startReg(JNIEnv* env)

{

//设置线程创建方法为javaCreateThreadEtc

androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);

env->PushLocalFrame(200);

//进程NI方法的注册

if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {

env->PopLocalFrame(NULL);

return -1;

}

env->PopLocalFrame(NULL);

return 0;

}

register_jni_procs(gRegJNI, NELEM(gRegJNI), env)这行代码的作用就是就是循环调用gRegJNI数组成员所对应的方法。

static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)

{

for (size_t i = 0; i < count; i++) {

if (array[i].mProc(env) < 0) {

return -1;

}

}

return 0;

}

gRegJNI数组,有100多个成员变量,定义在AndroidRuntime.cpp:

static const RegJNIRec gRegJNI[] = {

REG_JNI(register_android_os_MessageQueue),

REG_JNI(register_android_os_Binder),

...

};

该数组的每个成员都代表一个类文件的jni映射,其中REG_JNI是一个宏定义,该宏的作用就是调用相应的方法。

比如MessageQueue和Binder方法都是Android系统启动时就已经注册,所以在AndroidRuntime.cpp中可以找到相应的native方法,见AndroidRuntime.cpp的gRegJNI数组。这些注册方法命令格式为:

register_[包名]_[类名]

示例一:以MessageQueue.java中的nativePollOnce方法为例,private native void nativePollOnce(long ptr, int timeoutMillis);

方法名:android.os.MessageQueue.nativePollOnce(),而相对应的native层方法名只是将点号替换为下划线,可得android_os_MessageQueue_nativePollOnce()。

前面说MessageQueue.java所定义的jni注册方法名应该是register_android_os_MessageQueue,的确存在于gRegJNI数组,说明这次JNI注册过程是有开机过程完成的。该方法在AndroidRuntime.cpp申明为extern方法:

extern int register_android_os_Messa

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值