JNI学习之步步深入二
来源:互联网 发布:人工智能 蒋里博士 编辑:程序博客网 时间:2024/04/20 08:49
JNI为了扮演在c/c++和java之间的匹配工作,它首先需要做的就是既要认识java中的数据类型,也要认识c/c++中的数据类型。这时,jni就相当于一个适配者了。好比,A与C两个人本来不认识,可是现在B认识A,B也认识C,那么通过C的指引和介绍,A和C就认识了!
那么jni如何做到既认识C/C++,也认识java呢?其实很简单,一张匹配表足矣,见图!
1、原始数据类型的匹配:
其中jni中的本地类型都是以j开头,可以在c/c++中直接和c/C++类型互通互换!
2、复杂数据类型的匹配:
几种复合数据类型,主要是字符串jstring和数组jarray。注意jni中复合数据类型不能直接转换为c/C++中相应的类型,需要调用jni中自带的相应的方法来操作!
3、同时,JNI中还包含了一组描述符,包含类描述符、域描述符和方法描述符。
3.1 类描述符
类描述符是类的完整名称(包名+类名),将原来的.分隔符换成/分隔符。比如在java代码中的java.lang.String类的类描述符就是java/lang/String。
对于数组,其描述符是[+该类型的域描述符。比如int[] 其描述符为[I;float[] 其描述符为[F;String[]其描述符为[Ljava/lang/String;对于int[][] 其描述符为[[I;以此类推。。。
3.2 域描述符
域描述符,分为原始数据类型的域描述符,和引用类型的域描述符。原始数据类型的域描述符如下图:
注意哦,仔细看看long类型的域描述符(J);
对于引用类型的域描述符,其以L开始,以;结束。对于数组,其为[+其类型的域描述符+;
比如:String类型的域描述符为Ljava/lang/String;int[]类型的域描述符为[I;Object[]类型的域描述符为[Ljava/lang/Object;
3.3 方法描述符
方法描述符,将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符。对于,没有返回值的,用V表示。看下面一组例子:
String test(); ----------------------------->()Ljava/lang/String;
int f(int i, Object j);---------------------->(ILjava/lang/Object;)I
set(byte[] bs);---------------------------->([B)V
- JNI学习之步步深入二
- JNI学习之步步深入二
- JNI学习之步步深入二
- NDK---JNI学习步步深入之二
- JNI学习之步步深入二
- JNI学习之步步深入一
- JNI学习之步步深入三
- JNI学习之步步深入一
- JNI学习之步步深入一
- JNI学习之步步深入三
- JNI学习之步步深入一
- JNI学习之步步深入三
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- NDK---JNI学习步步深入之一
- JNI步步深入
- Flex 如何实现按钮之间的切换,按钮点击事件
- 论证谁才是IT 职业教育的领导品牌
- 开发项目中的28原则
- 线程安全和可重入性以及线程安全函数
- android中霍夫变换检测圆
- JNI学习之步步深入二
- 逻辑运算的短路问题
- 【objc】基础结构objc_class的布局,老版本vs新版本
- 个人学习整理:C++版插入排序
- unity3d shader
- 自定义的dialog
- LocationDisplayManager
- python 函数嵌套
- IT管理者的成功蜕变 看致命7宗罪