一、简介
在 JNI 开发中,我们知道,Java 的数据类型并不是直接在 JNI 里使用的,例如 int 就是使用 jint 来表示。
那么,就如我们来认识一下这些数据类型吧。
二、基本数据类型
Java数据类型 | JNI本地类型 | C/C++数据类型 | 数据类型描述 |
boolean | jboolean | unsigned char | C/C++无符号8为整数 |
byte | jbyte | signed char | C/C++有符号8位整数 |
char | jchar | unsigned short | C/C++无符号16位整数 |
short | jshort | signed short | C/C++有符号16位整数 |
int | jint | signed int | C/C++有符号32位整数 |
long | jlong | signed long | C/C++有符号64位整数 |
float | jfloat | float | C/C++32位浮点数 |
double | jdouble | double | C/C++64位浮点数 |
三、引用数据类型
Java的类类型 | JNI的引用类型 | 类型描述 |
java.lang.Object | jobject | 可以表示任何Java的对象,或者没有 JNI对应类型的Java 对象(实例方法的强制参数) |
java.lang.String | jstring | Java的String字符串类型的对象 |
java.lang.Class | jclass | Java的Class类型对象(静态方法的强制参数) |
Object[] | jobjectArray | Java任何对象的数组表示形式 |
boolean[] | jbooleanArray | Java基本类型boolean的数组表示形式 |
byte[] | jbyteArray | Java基本类型byte的数组表示形式 |
char[] | jcharArray | Java基本类型char的数组表示形式 |
short[] | jshortArray | Java基本类型short的数组表示形式 |
int[] | jintArray | Java基本类型int的数组表示形式 |
long[] | jlongArray | Java基本类型long的数组表示形式 |
float[] | jfloatArray | Java基本类型float的数组表示形式 |
double[] | jdoubleArray | Java基本类型double的数组表示形式 |
java.lang.Throwable | jthrowable | Java的Throwable类型,表示异常的所有类型和子类 |
void | void | N/A |
四、数据类型描述符
1. 什么是数据类型描述符
在JVM虚拟机中,存储数据类型的名称时,是使用指定的描述符来存储,而不是我们习惯的 int,float 等。
2. 对照表
Java类型 | 类型描述符 |
int | I |
long | J |
byte | B |
short | S |
char | C |
float | F |
double | D |
boolean | Z |
void | V |
其他引用类型 | L+类全名+; |
数组 | [ |
方法 | (参数)返回值 |
3. 示例
3.1 例如我们要表示一个 String 类
Java 类型:java.lang.String
JNI 描述符:Ljava/lang/String;
即一个 Java 类对应的描述符,就是 L 加上类的全名,其中 . 要换成 / ,最后 不要忘掉末尾的分号。
3.2 假如我们想要表示数组的话
Java 类型:String[]
JNI 描述符:[Ljava/lang/String;
Java 类型:int[][]
JNI 描述符:[[I
数组就是简单的在类型描述符前加 [ 即可,二维数组就是两个 [ ,以此类推。
3.3 方法
Java 方法:long f (int n, String s, int[] arr);
JNI 描述符:(ILjava/lang/String;[I)J
Java 方法:void f ();
JNI 描述符:()V
括号内是每个参数的类型符,括号外就是返回值的类型符。
其它:
NDK 学习系列:Android NDK 从入门到精通(汇总篇)