没有完全原创,参考下面链接的大部分内容:
http://blog.csdn.net/zhenyongyuan123/article/details/5862054
http://blog.sina.com.cn/s/blog_7a2ffd5c01013vrv.html
本文仅作学习使用。
实现JNI中本地函数注册有两种方式:
1.采用默认的本地函数注册流程。
2.自己重写JNI_OnLload()函数。
当Android的VM执行到C组件(*so)里的System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数,其用途有二
一、告诉java VM此C组件使用哪一个JNI版本。
如果你没有提供JNI_OnLoad()函数,VM会默认使用最老得JNI1.1版本。
二、可以藉由JNI_OnLoad()来获取JNIEnv.JNIEnv代表java环境,通过JNIEnv*指针就可以对java端的代码进行操作。
如(可参考android_media_MediaPlayer.cpp):
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("ERROR: GetEnv failed\n");
goto bail;
}
assert(env != NULL);
......
if (register_android_mtp_MtpDatabase(env) < 0) {
ALOGE("ERROR: MtpDatabase native registration failed");
goto bail;
}
......
/* success -- return valid version number */
result = JNI_VERSION_1_4;
bail:
return result;
}
实例一:C++调用java中的方法