牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2012-05-25 投稿人: 浏览次数:152


                                                                                         本文原创,转载请注明出处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;

 

  域描述符


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。