本文原创,转载请注明出处: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 类型存取其值 ;

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

  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数据类型的详解》

JNI学习积累之二 ---- 数据类型映射、域描述符说明的更多相关文章

  1. [转]jni数据类型映射、域描述符说明

    在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下: 1.primitive types ---- ...

  2. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

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

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

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

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

  5. USB学习笔记连载(十二):USB描述符

    USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...

  6. USB学习小记-HID类键盘的报告描述符的理解

    前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...

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

    主要资料来源: 百度文库的<JNI常用函数> . 同时对其加以了补充 . 要素  :1. 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的 ...

  8. Python学习总结之二 -- 数据类型

    带你走进数据类型 一:整数.浮点数 Python中整数和浮点数的定义以及运算和C++都是一样的,我在这里就不需多说了,我就说明一点:Python相对于C/C++而言,定义整数没有int 和 long ...

  9. 〖C语言学习笔记 〗(二) 数据类型

    前言 本文为c语言的学习笔记,很多只是留下来占位的 数据类型 助记:变量就是在内存中挖个坑并给这个坑命名,而数据类型就是挖内存的坑的尺寸 基础类型 整数类型: short int int long i ...

随机推荐

  1. NodeJS学习笔记 (4)网络服务-http(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...

  2. Vue过渡与动画

    通过 Vue.js 的过渡系统,可以在元素从 DOM 中插入或移除时自动应用过渡效果.Vue.js 会在适当的时机为你触发 CSS 过渡或动画,你也可以提供相应的 JavaScript 钩子函数在过渡 ...

  3. 常用Java开源库(新手必看)

    Jakarta common: Commons LoggingJakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具 ...

  4. solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法

    solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法 原创 2015年08月21日 20:47:40 标签: ...

  5. layDate1.0正式公布,您一直在寻找的的js日期控件

    你是时候换一款日期控件了,而layDate很愿意和您成为工作伙伴.她正致力于成为全球最高大上的web日期支撑,为国内外全部从事web应用开发的同仁提供力所能及的动力.她基于原生JavaScript精心 ...

  6. JavaScript检查手机格式是否错误

    编写自己定义的JavaScript函数checkPhone(),在函数中应用正則表達式推断手机号码的格式是否正确,不对的给出提示 <script type="text/javascri ...

  7. 主程的晋升攻略(4):TCP、消息分包和协议设计

    在<主程的晋升攻略(3):IP.DNS和CDN>中,一次网络请求经过DNS解析知道了目的IP,如今就要发出网络包,这里我们说一说TCP的相关话题. TCP是一种流式协议 讲网络编程的教科书 ...

  8. POJ 1741 Tree 树的分治(点分治)

    题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...

  9. 怎样选择正确的HTTP状态码

    本文来源于我在InfoQ中文站翻译的文章.原文地址是:http://www.infoq.com/cn/news/2015/12/how-to-choose-http-status-code 众所周知. ...

  10. ES cross cluster search跨集群查询

    ES 5.3以后出的新功能.测试demo如下: 下载ES 5.5版本,然后分别本机创建2个实例,配置如下: cluster.name: xx1 network.host: 127.0.0.1 http ...