Android JNI详述
2010-07-15 20:31:00 来源:WEB开发网};
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
更多精彩
赞助商链接