JNI的数据类型
基本类型
| JNI类型 | Java类型 | 描述 |
|---|---|---|
| jbyte | byte | 有符号,8位,整型 |
| jshort | short | 有符号,16位,整型 |
| jint | int | 有符号,32位,整型 |
| jlong | long | 有符号,64位,整型 |
| jfloat | float | 32位,浮点型 |
| jdouble | double | 64位,浮点型 |
| jboolean | boolean | 无符号,8位,整型 |
| jchar | char | 无符号,16位,整型 |
| void | void | N/A |
引用类型
| JNI类型 | Java类型 | 描述 |
|---|---|---|
| jclass | Class | 类 |
| jobject | Object | Java对象 |
| jstring | String | 字符串 |
| jobjectArray | Object[] | 对象数组 |
| jbyteArray | byte[] | byte数组 |
| jshortArray | short[] | short数组 |
| jintArray | int[] | int数组 |
| jlongArray | long[] | long数组 |
| jfloatArray | float[] | float数组 |
| jdoubleArray | double[] | double数组 |
| jbooleanArray | boolean[] | boolean数组 |
| jcharArray | char[] | char数组 |
| jthrowable | Throwable | Throwable |
jmethodID、jfieldID
jmethodID可用于获取类中函数的标识,然后通过此标识来调用函数。
jfieldID可用于获取类中变量的标识,然后通过此标识来读写变量。
JNI的类型签名
- JNI的类型签名标识了一个特定的Java类型,这个类型可以是类、方法或数据类型。
类和对象的签名
-
采用
L+包名+类名+;的形式,且将包名中的.替换为/。如:
java.lang.String的签名为Ljava/lang/String;,注意末尾的;也是签名的一部分。
基本数据类型的签名
-
基本数据类型的签名是有规律的。
- 一般为首字母的大写;
- boolean用Z,因为B被byte占用了;
- long用J,因为L用来表示类的签名。
| Java类型 | 签名 |
|---|---|
| byte | B |
| short | S |
| int | I |
| long | J |
| float | F |
| double | D |
| boolean | Z |
| char | C |
| void | V |
数组的签名
- 一维数组的签名就是
[+类型签名。
| Java类型 | 签名 |
|---|---|
| Object[] | [Ljava/lang/Object |
| String[] | [Ljava/lang/String |
| byte[] | [B |
| short[] | [S |
| int[] | [I |
| long[] | [J |
| float[] | [F |
| double[] | [D |
| boolean[] | [Z |
| char[] | [C |
-
多维数组的签名就是
n个[+类型签名,其中n表示数组的维度。如:
int[][]的签名为[[I。
方法的签名
-
方法的签名为:(各参数类型签名)返回值类型签名。
如:
int func1()的签名为()I。如:
void func2(int i)的签名为(I)V。如:
boolean func3(int a, double b, String[] c)的签名为(ID[Ljava/lang/String)Z。