JNI和NDK编程(三)JNI的数据类型和类型签名

ndk开发基础学习笔记系列:

JNI和NDK编程(一)JNI的开发流程
JNI和NDK编程(二)NDK的开发流程
JNI和NDK编程(三)JNI的数据类型和类型签名
JNI和NDK编程(四)JNI调用Java方法的流程

JNI的数据类型和类型签名

JNI的数据类型包含两种: 基本类型和引用类型.

基本类型主要有jboolean, jchar, jint等, 它们和Java中的数据类型对应关系如下表所示:

JNI类型Java类型描述
jbooleanboolean无符号8位整型
jbytebyte无符号8位整型
jcharchar无符号16位整型
jshortshort有符号16位整型
jintint32位整型
jlonglong64位整型
jfloatfloat32位浮点型
jdoubledouble64位浮点型
voidvoid无类型

JNI中的引用类型主要有类, 对象和数组. 它们和Java中的引用类型的对应关系如下表所示:

JNI类型Java类型描述
jobjectObjectObject类型
jclassClassClass类型
jstringStringString类型
jobjectArrayObject[]对象数组
jbooleanArrayboolean[]boolean数组
jbyteArraybyte[]byte数组
jcharArraychar[]char数组
jshortArrayshort[]short数组
jintArrayint[]int数组
jlongArraylong[]long数组
jfloatArrayfloat[]float数组
jdoubleArraydouble[]double数组
jthrowableThrowableThrowable

JNI的类型签名标识了一个特定的Java类型, 这个类型既可以是类也可以是方法, 也可以是数据类型.

类的签名比较简单, 它采用" L+包名+类型+; "的形式, 只需要将其中的.替换为/即可. 例如java.lang.String, 它的签名为Ljava/lang/String; , 注意末尾的;也是签名一部分.

基本数据类型的签名采用一系列大写字母来表示, 如下表所示:

Java类型签名Java类型签名Java类型签名
booleanZbyteBcharC
shortSintIlongJ
floatFdoubleDvoidV

从上表可以看出, 基本数据类型的签名基本都是单词的首字母大写, 但是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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值