4.Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:
java代码:
- typedef struct {
- const char* name;
- const char* signature;
- void* fnPtr;
- }
- JNINativeMethod;
其中比较难以理解的是第二个参数,例如
java代码:
- "()V"
- "(II)V"
- "(Ljava/lang/String;Ljava/lang/String;)V"
实际上这些字符是与函数的参数类型一一对应的。
"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();
"(II)V" 表示 void Func(int, int);
具体的每一个字符的对应关系如下
字符 Java类型 C类型
java代码:
- V void void
- Z jboolean boolean
- I jint int
- J jlong long
- D jdouble double
- F jfloat float
- B jbyte byte
- C jchar char
- S jshort short
数组则以"["开始,用两个字符表示
java代码:
- [I jintArray int[]
- [F jfloatArray float[]
- [B jbyteArray byte[]
- [C jcharArray char[]
- [S jshortArray short[]
- [D jdoubleArray double[]
- [J jlongArray long[]
- [Z jbooleanArray boolean[]
系列之Android 深入研究JNI(四)的帖子链接http://www.eoeandroid.com/thread-87017-1-1.html