以下内容来自书籍《Android开发艺术探索》
JNI的数据类型包含两种: 基本类型和引用类型.
基本类型主要有jboolean, jchar, jint等, 它们和Java中的数据类型对应关系如下表所示:
JNI类型 | Java类型 | 描述 |
---|---|---|
jboolean | boolean | 无符号8位整型 |
jbyte | byte | 无符号8位整型 |
jchar | char | 无符号16位整型 |
jshort | short | 有符号16位整型 |
jint | int | 32位整型 |
jlong | long | 64位整型 |
jfloat | float | 32位浮点型 |
jdouble | double | 64位浮点型 |
void | void | 无类型 |
JNI中的引用类型主要有类, 对象和数组. 它们和Java中的引用类型的对应关系如下表所示:
JNI类型 | Java类型 | 描述 |
---|---|---|
jobject | Object | Object类型 |
jclass | Class | Class类型 |
jstring | String | String类型 |
jobjectArray | Object[] | 对象数组 |
jbooleanArray | boolean[] | boolean数组 |
jbyteArray | byte[] | byte数组 |
jcharArray | char[] | char数组 |
jshortArray | short[] | short数组 |
jintArray | int[] | int数组 |
jlongArray | long[] | long数组 |
jfloatArray | float[] | float数组 |
jdoubleArray | double[] | double数组 |
jthrowable | Throwable | Throwable |
JNI的类型签名标识了一个特定的Java类型, 这个类型既可以是类也可以是方法, 也可以是数据类型.
类的签名比较简单, 它采用” L+包名+类型+; “的形式, 只需要将其中的.替换为/即可. 例如java.lang.String, 它的签名为Ljava/lang/String; , 注意末尾的;也是签名一部分.
基本数据类型的签名采用一系列大写字母来表示, 如下表所示:
Java类型 | 签名 | Java类型 | 签名 | Java类型 | 签名 |
---|---|---|---|---|---|
boolean | Z | byte | B | char | C |
short | S | int | I | long | J |
float | F | double | D | void | V |
从上表可以看出, 基本数据类型的签名基本都是单词的首字母大写, 但是boolean和long除外因为B已经被byte占用, 而long也被Java类签名的占用.
对象和数组的签名稍微复杂一些.
对象的签名就是对象所属的类签名, 比如String对象, 它的签名为Ljava/lang/String; .
数组的签名为[+类型签名, 例如byte数组. 其类型为byte, 而byte的签名为B, 所以byte数组的签名就是[B.同理可以得到如下的签名对应关系:
char[] [C
float[] [F
double[] [D
long[] [J
String[] [Ljava/lang/String;
Object[] [Ljava/lang/Object;
如果是多维数组那么就根据数组的维度多少来决定[的多少, 例如int[][]的签名就是[[I,其他情况可以依此类推.
方法的签名为(参数类型签名)+返回值类型签名.
举个例子, 如下方法: boolean fun1(int a, double b, int[] c). 参数类型的签名连在一起是ID[I, 返回值类型的签名为Z, 所以整个方法的签名就是(ID[I)Z
例如方法:boolean fun1(int a, String s, int[] c), 那么签名就是(ILjava/lang/String;[I)Z
为了更好的理解方法的签名格式, 下面再给出两个示例:
int fun1() 对应签名()I
int fun1(int i) 对应签名(I)I
网友评论