Android JNI详述
2010-07-15 20:31:00 来源:WEB开发网//#define LOG_NDEBUG 0
#define LOG_TAG "MediaPlayer-JNI"
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 ");
goto bail;
}
assert(env != NULL);
if (register_android_media_MediaPlayer(env) < 0) {
LOGE("ERROR: MediaPlayer native registration failed ");
goto bail;
}
if (register_android_media_MediaRecorder(env) < 0) {
LOGE("ERROR: MediaRecorder native registration failed ");
goto bail;
}
if (register_android_media_MediaScanner(env) < 0) {
LOGE("ERROR: MediaScanner native registration failed ");
goto bail;
}
if (register_android_media_MediaMetadataRetriever(env) < 0) {
LOGE("ERROR: MediaMetadataRetriever native registration failed ");
goto bail;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
bail:
return result;
}
此函数回传JNI_VERSION_1_4 值给VM ,于是VM 知道了其所使用的JNI 版本了。此外,它也做了一些初期的动作( 可呼叫任何本地函数) ,例如指令:
if (register_android_media_MediaPlayer(env) < 0) {
LOGE("ERROR: MediaPlayer native registration failed ");
goto bail;
}
就将此组件提供的各个本地函数(Native Function) 登记到VM 里,以便能加快后续呼叫本地函数的效率。
JNI_OnUnload() 函数与JNI_OnLoad() 相对应的。在载入C 组件时会立即呼叫JNI_OnLoad() 来进行组件内的初期动作;而当VM 释放该C 组件时,则会呼叫JNI_OnUnload() 函数来进行善后清除动作。当VM 呼叫JNI_OnLoad() 或 JNI_Unload() 函数时,都会将VM 的指针(Pointer) 传递给它们,其参数如下:
更多精彩
赞助商链接