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. activiti-explorer 流程中文乱码问题

    1.activiti-cfg.xml的修改,添加activityFontName和labelFontName属性 <bean id="processEngineConfiguratio ...

  2. SQLSERVER调用DLL程序

    在SQL Server中调用dll分为两个步骤 1.创建一个dll文件(dll文件分成3种类型,讲其中一种) 2.把dll文件放进SQL Server的程序集中.然后定义一个Function,就可以通 ...

  3. Xamarin.Forms+Prism(2)—— 基本使用 NavigationService 相对路径和绝对路径

    本文主要对Prism框架下的导航服务NavigationService进行一次介绍和使用. 1.打开VS,可以看到左侧的已安装模版里面有: 2.创建完成后,从PCL项目中,看到App.xaml.cs中 ...

  4. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

  5. js同比例缩放图片

    function DrawImage(ImgD, FitWidth, FitHeight) { var image = new Image(); image.src = ImgD.src; if (i ...

  6. 利用github和git命令,将本地项目共享到服务器上

    一.步骤 1. 创建项目根目录 mkdir 文件夹名 2. 初始化文件夹 git init 3. 配置用户名和邮箱(第一次配置后,不需要再登录) git config user.name 名字 git ...

  7. SpringMVC整合quartz,实现定时任务

    <dependency>        <groupId>org.quartz-scheduler</groupId>        <artifactId& ...

  8. HTML5 Canvas 绘制库存变化折线 计算出库存周转率

    <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type&quo ...

  9. ELK学习笔记

    一.elk框架和java1.8环境搭建 1.1: 环境说明 约定: centos6 iptables关闭 如果不关闭的话,需要开放对应的端口访问 selinux关闭 1.2: ELK简介 els:El ...

  10. 使用Python发送电子邮件

    使用python发送邮件并不难,这里使用的是SMTP协议. Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可. 代码如下: # coding:utf-8 im ...