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

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

使用JNI的副作用

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

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

数据类型映射

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

基本类型映射表

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

引用类型映射表

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

</tbody> </table>

注意

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

描述符

类描述符

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

域描述符

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

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

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数据类型的详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

es6入门

es6作为最新的js语言版本,有很多特性是不得不晓的。下面将语法中常用的分析出来,对应到基本对象类型的会在对象里描述。

4910
来自专栏达摩兵的技术空间

es6入门

es6作为最新的js语言版本,有很多特性是不得不晓的。下面将语法中常用的分析出来,对应到基本对象类型的会在对象里描述。

9520
来自专栏令仔很忙

理解javascript作用域和作用域链

作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。

74710
来自专栏微信公众号:Java团长

Java面试宝典

允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:

24220
来自专栏Golang语言社区

Golang语言的函数调用信息

函数的调用信息是程序中比较重要运行期信息, 在很多场合都会用到(比如调试或日志). Go语言 runtime 包的 runtime.Caller / runti...

57460
来自专栏九彩拼盘的叨叨叨

ES6 之 Proxy 介绍

Proxy(代理) 是 ES6 中新增的一个特性。Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。

11130
来自专栏高性能服务器开发

Redis应用总结

首先, 我带大家简单的了解一下Redis Redis常用数据类型(最为常用的数据类型主要有以下五种) ●String ●Hash ●List ●Set ●Sor...

35770
来自专栏linux运维学习

linux学习第六十五篇:for循环,while循环, break跳出循环,continue结束本次循环

for循环 语法:for 变量名 in 条件; do …; done for循环会以空格作为分隔符 案例1 #!/bin/bash sum=0 for i ...

298100
来自专栏爱撒谎的男孩

Spring依赖注入

45570
来自专栏开发技术

排序之简单选择排序

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中...

11620

扫码关注云+社区

领取腾讯云代金券