[转]jni数据类型映射、域描述符说明
在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数据类型映射、域描述符说明的更多相关文章
- JNI学习积累之二 ---- 数据类型映射、域描述符说明
本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...
- JNI实战(三):JNI 数据类型映射
在JNI实战(二):Java 调用 C 我们了解了JNI的静态注册和动态注册.也知道我们应该使用动态注册来进行JNI函数与Java方法之间的映射. 示例的映射表的数组为如下: static JNINa ...
- 006android初级篇之jni数据类型映射
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 使用JNI的副作用 一旦使用JNI,JAVA程序就丧失了JAV ...
- JNI数据类型(转)
本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...
- NDK开发之获得域和方法描述符
在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...
- JNI字段描述符-Java Native Interface Field Descriptors
一.JNI字段描述符 "[I" --- int[] "[[[D" --- double[][][] 如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符 ...
- JNI字段描述符(转)
转载自http://fgsink.blog.163.com/blog/static/16716997020124310169911/ “([Ljava/lang/String;)V” 它是一种对函数返 ...
- JNI字段描述符
“([Ljava/lang/String;)V” 它是一种对函数返回值和参数的编码.这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors).一个数组 ...
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...
随机推荐
- mybatis做like模糊查询
http://www.cnblogs.com/cyttina/p/3894428.html
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- Eclipse快捷键/快捷操作汇总
1.建立.切换不同的工作空间: 工作空间是放置项目的,它是项目的集合,多个工程放在一个工作空间上容易出问题,建议把不同项目存放在单独的工作 空间内,让项目代码更加有序 file → switch w ...
- HDU4080 Stammering Aliens(二分 + 后缀数组)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...
- storm UI
Storm UI ——本文主要解释下storm ui上各项属性的含义. 通过http://UI_Server:8080可以打开Storm Web UI看看Storm集群的状态. 1. mainpage ...
- Hadoop Streaming框架使用(一)
Streaming简介 link:http://www.cnblogs.com/luchen927/archive/2012/01/16/2323448.html Streaming框架允许任何程 ...
- 再探CSS 中 class 命名规范
一直以来我的CSS 的 class命名都是比较随意,有时采用驼峰式.有时采用下划线,好像没有什么统一的标准,想到什么英文单词就拿过来用,这对于自己瞎写的小项目无伤大雅,遇到冲突的问题可稍加调整改变即可 ...
- 当编译AFNetworking 2.0时出现了Undefined symbols for architecture i386
当将AFNetworking添加到工程后编译时出现 Undefined symbols for architecture i386: "_SecCertificateCopyData&quo ...
- [知识点]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html ...
- LINQ to Entities 和LINQ to Objects 的区别
本文资料来源:http://www.codeproject.com/Articles/246861/LINQ-to-Entities-Basic-Concepts-and-Features) LINQ ...