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学习积累之二 ---- 数据类型映射、域描述符说明

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...

  2. JNI实战(三):JNI 数据类型映射

    在JNI实战(二):Java 调用 C 我们了解了JNI的静态注册和动态注册.也知道我们应该使用动态注册来进行JNI函数与Java方法之间的映射. 示例的映射表的数组为如下: static JNINa ...

  3. 006android初级篇之jni数据类型映射

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 使用JNI的副作用 一旦使用JNI,JAVA程序就丧失了JAV ...

  4. JNI数据类型(转)

    本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...

  5. NDK开发之获得域和方法描述符

    在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...

  6. JNI字段描述符-Java Native Interface Field Descriptors

    一.JNI字段描述符 "[I" ---  int[] "[[[D" --- double[][][] 如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符 ...

  7. JNI字段描述符(转)

    转载自http://fgsink.blog.163.com/blog/static/16716997020124310169911/ “([Ljava/lang/String;)V” 它是一种对函数返 ...

  8. JNI字段描述符

    “([Ljava/lang/String;)V” 它是一种对函数返回值和参数的编码.这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors).一个数组 ...

  9. JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...

随机推荐

  1. tomcat 部署spring工程乱码解决方案

    tomcat的server.xml文件,Connector标签增加useBodyEncodingForURI="true"属性 web.xml如下配置 <filter> ...

  2. ios retain 与 copy 的区别

    .retain 与copy区别 retain 的仅仅是引用计数加1,但是并没有创建新的对象.它们的指针是指向相同的内存地址. copy 是创建一个新的对象作为原来对象的副本,新创建出来的引用计数并没有 ...

  3. NOIP 2012 Day2T2 借教室题解

    NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...

  4. 【BZOJ】3093: [Fdu校赛2012] A Famous Game

    http://www.lydsy.com/JudgeOnline/problem.php?id=3093 题意:n个球(红和蓝两种),等概率有1~n个红球.首先取出p个球且这p个球里边有q个红球,问从 ...

  5. POJ 1127 Jack Straws(计算几何)

    题目链接 抄的模版,居然1Y了.就是简单的线段相交+并查集. #include <iostream> #include <cstring> #include <cstdi ...

  6. C#_数据转换 实用方法

    [String转Array]string str = "123asd456asd789";单字符: string[] a0 = str.Split('a');多字符: string ...

  7. 基于FSIOT_A 实验平台SAM3S4B cortex-M3的温湿度采集

    作者:卢老师,华清远见嵌入式学院讲师. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感器技术,确保产品具有极高的可靠性与卓越的长期稳 ...

  8. Setting start page of Windows Phone dynamically through code

    Essentially this one line of code will set the start page of the application. var navTo = new Uri(&q ...

  9. 用CSS设置Table的细边框的最好用的方法

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 【周年版】Cnblogs for Android

    前言 扒衣见君节刚过去但是炎热夏天还在继续: 自14年8月推出博客园Android客户端以来,断断续续发了十几个后续版本,期间出现过各种问题,由于接口等诸多因素,每个模块的功能都可能随着时间和博客园主 ...