WEB开发网
开发学院手机开发Android 开发 Android JNI详述 阅读

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 (
函数,其程式码片段为:

//#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) 传递给它们,其参数如下:

上一页  1 2 3 4 5 6 7  下一页

Tags:Android JNI 详述

编辑录入:coldstar [复制链接] [打 印]
赞助商链接