美文网首页NDK笔记
JNI数据类型和类型签名

JNI数据类型和类型签名

作者: miaoyongjun | 来源:发表于2017-06-27 20:42 被阅读255次

以下内容来自书籍《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

相关文章

网友评论

    本文标题:JNI数据类型和类型签名

    本文链接:https://www.haomeiwen.com/subject/wvtycxtx.html