JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)

使用JNI的副作用

一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:

  1. 程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
  2. 程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。

数据类型映射

在Java存在两种数据类型:基本类型和引用类型(primitive types 和reference types)
在JNI中也同样存在类似类型的映射

基本类型映射表

Java类型 本地C类型(NativeType) 实际表示的c类型 说明
boolean jboolean unsigned char
byte jbyte signed char
char jchar unsigned char
short jshort unsigned short
int jint long 有符号,32 位
long jlong __int64 有符号,64 位
float jfloat float
double jdouble double
void void N/A

引用类型映射表

Java类型 本地C类型(NativeType) 说明
Object jobject Class类对象
String jstring 字符串对象
Object[] jobjectArray 对象数组
boolean[] jbooleanArray 布尔类型数组
byte[] jbyteArray
char[] jcharArray 字符型数组
short[] jshortArray
int[] jintArray
long[] jlongArray 长整型数组
float[] jfloatArray
double[] jdoubleArray 双精度浮点型数组

注意

  1. 基本类型在Native层可以直接引用
  2. 引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用
  3. 多维数组(包括二维数组)都是引用类型,需要使用 jobjectArray 类型存取其值 ;

描述符

类描述符

是类的完整名称(包名+类名),将原来的 . 分隔符换成 / 分隔符。
如在java代码中的java.lang.String类的类描述符就是java/lang/String

域描述符

1. 基本类型的域描述符已经定义好

Java语言类型 域描述符
boolean Z
byte B
char C
short S
int I
long J(?为什么不是L)
float F
double D

2. 引用类型的描述符

  1. 一般引用类型则为 L + 该类型类描述符 + “;” 。

    例如:String类型的域描述符为 Ljava/lang/String;

  2. 对于数组,其为 : [ + 其类型的域描述符 + ;

    int[ ] 其描述符为[I

    float[ ] 其描述符为[F

    String[ ] 其描述符为[Ljava/lang/String;

    Object[ ]类型的域描述符为[Ljava/lang/Object;

  3. 多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组。例如:

    int [ ][ ] 其描述符为[[I

    float[ ][ ] 其描述符为[[F

参考链接

  1. JNI学习积累之二 ---- 数据类型映射、域描述符说明
  2. Android的NDK开发(3)————JNI数据类型的详解

006android初级篇之jni数据类型映射的更多相关文章

  1. 008android初级篇之jni中数组的传递

    008android初级篇之jni中数组的传递 jni中在native中数据类型的实际类型 jchar 占两个字节,跟native c中的char(占一个字节)是两个数据类型 jbyte, unsig ...

  2. .NET C#教程初级篇 1-1 基本数据类型及其存储方式

    .NET C# 教程初级篇 1-1 基本数据类型及其存储方式 全文目录 (博客园).NET Core Guide (Github).NET Core Guide 本节内容是对于C#基础类型的存储方式以 ...

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

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

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

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

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

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

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

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

  7. JNI数据类型(转)

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

  8. Kotlin——初级篇(八):关于字符串(String)常用操作汇总

    在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin--初级篇(三):数据类型详解这篇文章. 在 ...

  9. .NET Core CSharp初级篇 1-8泛型、逆变与协变

    .NET Core CSharp初级篇 1-8 本节内容为泛型 为什么需要泛型 泛型是一个非常有趣的东西,他的出现对于减少代码复用率有了很大的帮助.比如说遇到两个模块的功能非常相似,只是一个是处理in ...

随机推荐

  1. [Git] Git把Tag推送到远程仓库

    转载: http://blog.csdn.net/hustpzb/article/details/8056518 用git tag来给工程打上标签,但是这个命令只是在本地仓库打标签而已, 为了能把标签 ...

  2. JavaScriptCore全面解析 (上篇)

    收录待用,修改转载已取得腾讯云授权 作者 | 殷源 编辑 | 迷鹿 殷源,专注移动客户端开发,微软Imagine Cup中国区特等奖获得者,现就职于腾讯. JavaScript越来越多地出现在我们客户 ...

  3. 【转载】tcp窗口滑动以及拥塞控制

    转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥 ...

  4. 2017.10.25 es-sql分页无效

    1.问题描述 使用es-sql聚合查询时,发现无法进行分页操作. 结果为16条: 当使用limit语法进行分页之后,发现并没有效果(以取5条记录为一页为例). 首先查询前5条记录: 返回的记录如下图: ...

  5. JMS-activeMq发布订阅模式(非持久订阅)

    Publisher的代码: import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Deli ...

  6. C#文本框中默认是不允许使用全选的

    C#文本框中默认是不允许使用全选的.可以通过以下事件完成:  private void textBox1_KeyDown(object sender, KeyEventArgs e) {      i ...

  7. Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)

    信号  ( signal ) 机制是 UNIX 系统中最为古老的进程间通信机制,很多条件可以产生一个信号. 信号的产生: 1,当用户按下某些按键时,产生信号. 2,硬件异常产生信号:除数为 0 ,无效 ...

  8. Java 遍历一个对象的属性 将非空属性赋值给另一个对象

    //将origin属性注入到destination中 public <T> void mergeObject(T origin, T destination) { if (origin = ...

  9. IE6 ajax解析parseerror

    IE6下,用a[href="javascript:void(0);"]或者a[href="javascript:;"]发起ajax|jsonp请求会出现请求成功 ...

  10. Html添加百度地图

    方法/步骤 1.打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html 如下图: 2.在“1.定位中心点”中,切换城市,并 ...