前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >006android初级篇之jni数据类型映射

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

作者头像
上善若水.夏
发布2018-09-28 10:35:09
4010
发布2018-09-28 10:35:09
举报
文章被收录于专栏:上善若水上善若水上善若水

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数据类型的详解
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015.11.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用JNI的副作用
  • 数据类型映射
    • 基本类型映射表
      • 引用类型映射表
        • 注意
        • 描述符
          • 类描述符
            • 域描述符
              • 1. 基本类型的域描述符已经定义好
              • 2. 引用类型的描述符
          • 参考链接
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档