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. Intellij IDEA System.out.println输出中文乱码问题

    进行下列设置即可:

  2. centos7.2 kvm虚拟化管理平台WebVirtMgr部署

    在服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求.当KVM宿主机越来越多,需要对宿主机的状态进行调控,决定采用WebVirtMgr作为kvm虚拟化的web管理工具,图形化的WEB,让人 ...

  3. cpp面向对象编程

    如下图,先建好文件, 这里用的是Visual studio 2010 当然也可以用eclipse for cpp,如下图: AbstractShape.h #ifndef ABSTRACTSHAPE_ ...

  4. javascript数据类型检测方法

    一.字符串.数字.布尔值.undefined的最佳选择市使用 typeof 运算符进行检测: 对于字符串,typeof 返回"string" 对于数字,typeof 返回" ...

  5. http://www.cnblogs.com/monian/p/3822980.html

    http://www.cnblogs.com/monian/p/3822980.html

  6. Spring boot 数据源未配置异常

    问题 在使Springboot自动生成的项目框架时如果选择了数据源,比如选择了mysql,生成项目之后,启动会报一下异常: Description: Cannot determine embedded ...

  7. Github:在Github上创建自己的代码仓库

    Github是一个分布式版本控制系统,最初由Linux之父Linus Torvalds编写,在云时代的今天已经成为了开发者管理代码和发现已有代码的最常用工具之一,下面我们将开始git之旅. 注册Git ...

  8. MPTCP 源码分析(二) 建立子路径

    简述      MPTCP在进行三次握手之后,客户端和服务端会进行地址信息的交换,让对方知道彼此未用的地址信息. 当客户端知道服务端的地址后就可以建立其他子路径.三次握手和建立子路径的过程如图1:   ...

  9. hdu1509(Windows Message Queue) 优先队列

    点击打开链接 Problem Description Message queue is the basic fundamental of windows system. For each proces ...

  10. iOS CAReplicatorLayer 简单动画

    代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...