本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning

在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 。

在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下:

1、primitive types ----基本数据类型,如:int、 float 、char等基本类型

2、reference types----引用类型,如:类、实例、数组。

特别需要注意:数组 ------ 不管是对象数组还是基本类型数组,都作为reference types存在。

1、primitive types (基本数据类型)映射参见下表:

这些基本数据类型都是可以在Native层直接使用的 。

2、reference types (引用数据类型)映射参见下表

                Java类型                      Native Type                                          描述

注意   

        1、引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用

        2、多维数组(包括二维数组)都是引用类型,需要使用 jobjectArray 类型存取其值 ;

                 例如:二维整型数组就是指向一位数组的数组,其声明使用方式如下:

[java] view plaincopy print?
  1. //获得一维数组 的类引用,即jintArray类型
  2. jclass intArrayClass = env->FindClass("[I");
  3. //构造一个指向jintArray类一维数组的对象数组,该对象数组初始大小为dimion
  4. jobjectArray obejctIntArray  =  env->NewObjectArray(dimion ,intArrayClass , NULL);
  5. ...//具体操作

另外,关于引用类型的一个继承关系如下,我们可以对具有父子关系的类型进行转换:

类描述符

类描述符是类的完整名称(包名+类名),将原来的 . 分隔符换成 / 分隔符。

例如:在java代码中的java.lang.String类的类描述符就是java/lang/String

其实,在实践中,我发现可以直接用该类型的域描述符取代,也是可以成功的。

例如:        jclass intArrCls = env->FindClass("java/lang/String")

等同于      jclass intArrCls = env->FindClass("Ljava/lang/String;")

数组类型的描述符则为,则为:  [ + 其类型的域描述符        (后文说明)

例如:

int [ ]     其描述符为[I

float [ ]   其描述符为[F

String [ ]  其描述符为[Ljava/lang/String;

域描述符

    1、基本类型的描述符已经被定义好了,如下表所示:

2、引用类型的描述符


一般引用类型则为 L + 该类型类描述符 + ;   (注意,这儿的分号“;”只得是JNI的一部分,而不是我们汉语中的分段,下同)

例如:String类型的域描述符为 Ljava/lang/String;

对于数组,其为 :  [ + 其类型的域描述符 + ;

int[ ]     其描述符为[I

float[ ]   其描述符为[F

String[ ]  其描述符为[Ljava/lang/String;

Object[ ]类型的域描述符为[Ljava/lang/Object;

多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组。例如:

int  [ ][ ] 其描述符为[[I

float[ ][ ] 其描述符为[[F

方法描述符

将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符,规则如下: (参数的域描述符的叠加)返回

类型描述符。对于,没有返回值的,用V(表示void型)表示。举例如下:

Java层方法                                               JNI函数签名

String test ( )                                              Ljava/lang/String;

int f (int i, Object object)                            (ILjava/lang/Object;)I

void set (byte[ ] bytes)                                ([B)V

在编程时,如果是利用javah工具的话,这些都不需要我们手动编写对应的类型转换,如果不能用javah工具,就只能手动的

进行类型转换了。

下一篇将会以一个具体的实站去具体掌握JNI。

分析一个使用Android NDK 开发的系列博客,觉得挺不错的:

《 Android的NDK开发(3)————JNI数据类型的详解》

转载于:https://www.cnblogs.com/Free-Thinker/p/6168949.html

JNI学习积累之二 ---- 数据类型映射、域描述符说明相关推荐

  1. 【转】JNI学习积累之一 ---- 常用函数大全

    原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...

  2. JNI学习积累之一 ---- 常用函数大全

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还 ...

  3. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  4. OpenCV3学习(11.3)关键点的描述符KeyPoint对象与匹配类DMatch

    corners:包含大量本地信息的像素块,并能够在另一张图中被快速识别 keypoints:作为 corners 的扩展,它将像素块的信息进行编码从而使得更易辨识,至少在原则上唯一 descripto ...

  5. JNI学习笔记——(二)Native操作Java对象

    注:编码工具是Android Studio. 目录 Native打印Java传入的String Native接收Java传入的基本类型数组打印并修改 Native遍历打印Java传入的引用类型数组 N ...

  6. jni学习实例(二)-a7105模块驱动之jni

    #include <stdio.h> #include <string.h> #include <jni.h> #include <fcntl.h> / ...

  7. Android-JNI开发系列《七》补充jni与java的数据类型的对应关系和数据类型描述符

    人间观察 人只有不为生存而烦恼的时候,才会追求真正想要的东西. 在前面的几篇文章中有涉及到Java和JNI的通信,比如异常回调,Java和JNI的互相调用等.其中都免不了在通信过程中需要知道Java基 ...

  8. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

    Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...

  9. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

最新文章

  1. protobuf简单序列化反序列化示例
  2. 第一天2017/03/28
  3. 【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...
  4. 深度学习笔记 第五门课 序列模型 第二周 自然语言处理与词嵌入
  5. (转)函数作用域,匿名函数,函数式编程,面向过程,面向对象
  6. C++ 程序内存泄漏检测方法
  7. java sunjce,无法初始化类javax.crypto.SunJCE_b
  8. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
  9. VS2008建立webserver(转)
  10. STL中的next_permutation
  11. 探索私有云OpenStack管理选项
  12. IIS 7 配置备份和还原
  13. Python处理僵尸进程
  14. 中国国家航天局:探月工程四期还有三次任务
  15. asp.net配置web.config发电子邮件详解
  16. 线上CPU飙高问题排查 (Java)
  17. C1见习工程师能力认证 考纲
  18. 编写Shell脚本实现用户管理
  19. ESP32 使用 Arduino 实现 OTA 更新
  20. 在MTK7628平台编译Silicon的zigbee Host程序

热门文章

  1. springBoot后台发送内容至邮箱
  2. python float字节数_float型的数在内存中的表示 附:python3解析函数 | 学步园
  3. mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句
  4. mysql+phpMyAdmin错误解决:bug #4813 MySQL 5.7.6 and the Users menu tab
  5. [linux]ps结果计算行数
  6. java wav 时间,Java-调整WAV文件的播放速度
  7. 舞力全开加速_国行舞力全开评测:丝滑得不像是育碧服务器!
  8. python基本数据类型选择题-python基础学习——基础数据类型练习题(二)
  9. bootstrap 栅栏剧中_Bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法...
  10. php提交raw_PHP中如何POST提交raw数据?