env在GetStaticFieldID和GetMethodID 时,函数参数和返回值的类型要指定类型标识串,如:
jmethodID init = env->GetMethodID(clz,"<init>","([B)V");
jfieldID field = env->GetFieldID(clz,"mName","Ljava/lang/String;");
1)基本类型对应关系
标识串 | Jni 类型 | C 类型 |
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 |
2)基本类型数组
(以 [ 开始,用两个字符表示)
标识串 | Jni 类型 | C 类型 |
[Z | jbooleanArray | bool [] |
[I | jintArray | int[] |
[J | jlongArray | long[] |
[D | jdoubleArray | double[] |
[F | jfloatArray | float[] |
[B | jbyteArray | byte[] |
[C | jcharArray | char[] |
[S | jshortArray | short[] |
3)类(class)
(以 L 开头,以 ; 结尾,中间是用 / 隔开的 包 及 类名)
标识串 | Java 类型 | Jni 类型 |
L包1/包n/类名; | 类名 | jobject |
Ljava/net/Socket; | Socket | jobject |
4)例外(String 类)
标识串 | Java 类型 | Jni 类型 |
L包1/包n/类名; | 类名 | jobject |
Ljava/lang/String; | String | jstring |
5)嵌套类
(类位于另一个类之中,则用$作为类名间的分隔符)
标识串 | Java 类型 | Jni 类型 |
L包1/包n/类名$嵌套类名; | 类名 | jobject |
Landroid/os/FileUtils$FileStatus; | FileStatus | jobject |
注意:
本文说的函数参数和返回值的类型,而在env->FindClass(xxx);时不写Ljava/lang/String; 而是java/lang/String
如:
jclass clz = env->FindClass("java/lang/String");