在android 中 ,顶层应用程序使用java语言,通过Dex 编译成bytecode时,就需要jvm来执行,如果java需要与本地模块交互时,vm 就会加载JNI本地模块,然后让java顺利的调用jni模块,
在android中,JNI是融合java和C/C++的关键技术
如何加载 System.loadLibrary(“*.so”);
首先去执行C模块里的JNI_onload();进行初始化设定,然后通过JNI_onUnload();释放。
static void android_media_MediaPlayer_prepare(JNIEnv *env){
.......
}
static void android_media_MediaPlayer_setDataSource(JNIEnv *env,jobject obj){
.......
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL; jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed\n");
} assert(env != NULL);
LOGE("ERROR: native registration failed\n");
goto bail;
} if (register_android_media_MediaRecorder(env) < 0) {
goto bail;
} if (register_android_media_MediaMetadataRetriever(env) < 0) {
LOGE("ERROR: native registration failed\n");
goto bail;
}
result = JNI_VERSION_1_4; bail:
return result;
} //
为了执行时提高效率,通常并且就是按以下方式进行,然后循环查找,将此gMethods[]中的内容注册到VM中;
static int register_android_media_MediaPlayer(JNIEnv *env){
return AndroidRuntime::registerNativeMethods(env,
"android/media/MediaPlayer", gMethods, NELEM(gMethods));
}
static JNINativeMethod gMethods[] = {
..........
{"setDataSource","(Ljava/lang/String;)V", (void *)android_media_MediaPlayer_setDataSource},
{"setDataSource", "(Ljava/io/FileDescriptor;JJ)V",(void *)android_media_MediaPlayer_setDataSourceFD},
{"prepare", "()V",(void *)android_media_MediaPlayer_prepare},
{"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
{"_start", "()V", (void *)android_media_MediaPlayer_start},
{"_stop", "()V", (void *)android_media_MediaPlayer_stop},
{"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth},
{"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight} ,
{"native_setup", "(Ljava/lang/Object;)V",(void *)android_media_MediaPlayer_native_setup},
{"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize},
..........
};
由于VM是多线程环境,所以JNIEnv* env用来标识,避免数据冲突
jstring jd( JNIEnv* env){
return env->NewStringUTF("");
}
调用过程中类型对应表如下
关于apk
apk是android 安装的套装程序,在android中是一种MIME为zip的压缩包,在windows中将后缀名修改成zip,就可以看到目录结构,因此可以加入自己的东西,比如说.so 放置到libs/交叉编译版本/.so下。