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

原创 2012年05月25日 22:31:04


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

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

                    

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


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

                    


  类描述符


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

           例如:在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/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系

当我们在调用一个Java native方法的时候,方法中的参数是如何传递给C/C++本地函数中的呢?Java方法中的参数与C/C++函数中的参数,它们之间是怎么转换的呢?我猜你应该也有相关的疑虑吧,咱...
  • xyang81
  • xyang81
  • 2014年12月20日 23:00
  • 8791

JNI基本数据类型

从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C...
  • yangchang999
  • yangchang999
  • 2014年04月07日 11:14
  • 5449

JNI的数据类型

转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 1 基本数据类型 ...
  • lanbingg
  • lanbingg
  • 2013年12月04日 13:27
  • 469

JNI 数据类型

从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C...
  • wangkr111
  • wangkr111
  • 2012年08月20日 21:31
  • 3949

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

JNI的数据类型和类型签名JNI的数据类型包含两种: 基本类型和引用类型.基本类型主要有jboolean, jchar, jint等, 它们和Java中的数据类型对应关系如下表所示: JNI类型 ...
  • lj402159806
  • lj402159806
  • 2017年04月03日 17:47
  • 927

关于JNI的代码格式以及JNI的数据类型

首先说说在C++代码中 (1)JNIEXPORT :在Jni编程中所有本地语言实现Jni接口的方法前面都有一个"JNIEXPORT",这个可以看做是Jni的一个标志,至今为止没发现它有什么...
  • lty406910111
  • lty406910111
  • 2017年04月06日 15:32
  • 341

JNI之------数据类型

JNI支持Unicode/UTF-8字符编码互转。Unicode以16-bits值编码;UTF-8是一种以字节为单位变长格式的字符编码,并与7-bitsASCII码兼容。UTF-8字串与C字串一样,以...
  • jingerppp
  • jingerppp
  • 2014年05月16日 10:08
  • 1302

Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2013年12月21日 14:33
  • 34396

NDK学习笔记:jni数据类型转换

随着Android项目中c++代码部分功能复杂程度的增加,jni中需要传递的数据类型也越来越多,关于jni数据类型转换网上有不少相关文章,但是在使用时发现这些例子中存在不少谬误,遂在此重新总结相关内容...
  • lidec
  • lidec
  • 2017年02月05日 15:27
  • 2981

JNI中java类型与C/C++类型对应关系及接口写法

1.了解JNI中JAVA类型与C/C++的映射关系 JAVA类型 本地类型 JNI中自定义类型 描述 int long jint/jsize signed 32 bits ...
  • haohaojian
  • haohaojian
  • 2017年06月06日 14:05
  • 558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI学习积累之二 ---- 数据类型映射、域描述符说明
举报原因:
原因补充:

(最多只允许输入30个字)