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

Android JNI详述

 2010-07-15 20:31:00 来源:WEB开发网   
核心提示:*)android_media_MediaPlayer_native_finalize},};static int register_android_media_MediaPlayer(JNIEnv *env){return AndroidRuntime::registerNativeMethods(env,"
*)android_media_MediaPlayer_native_finalize},

};

static int register_android_media_MediaPlayer(JNIEnv *env){

return AndroidRuntime::registerNativeMethods(env,

"android/media/MediaPlayer", gMethods, NELEM(gMethods));

}

jint JNI_OnLoad(JavaVM* vm, void* reserved){

if (register_android_media_MediaPlayer(env) < 0) {

LOGE("ERROR: MediaPlayer native registration failed ");

goto bail;

}

}

当VM 载入libmedia_jni.so 档案时,就呼叫JNI_OnLoad() 函数。接着,JNI_OnLoad() 呼叫 register_android_media_MediaPlayer() 函数。此时,就呼叫到 AndroidRuntime::registerNativeMethods() 函数,向VM( 即AndroidRuntime) 登记 gMethods[] 表格所含的本地函数了。简而言之,registerNativeMethods() 函数的用途有二:

(1) 更有效率去找到函数。

(2) 可在执行期间进行抽换。由于gMethods[] 是一个< 名称,函数指针> 对照表,在程序执行时,可多次呼叫registerNativeMethods() 函数来更换本地函数之指针,而达到弹性抽换本地函数之目的。

4.Andoird 中使用了一种不同传统Java JNI 的方式来定义其native 的函数。其中很重要的区别是Andorid 使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod ,定义如下:

typedef struct {

const char* name; /*Java 中函数的名字*/

const char* signature; /* 描述了函数的参数和返回值*/

void* fnPtr; /* 函数指针,指向C 函数*/

} JNINativeMethod;

其中比较难以理解的是第二个参数,例如

"()V"

"(II)V"

"(Ljava/lang/String;Ljava/lang/String;)V"

实际上这些字符是与函数的参数类型一一对应的。

"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();

"(II)V" 表示 void Func(int, int);

具体的每一个字符的对应关系如下

字符 Java 类型 C 类型

V void void

Z jboolean boolean

I jint int

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

Tags:Android JNI 详述

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