文档章节

四、JNI数据类型

unic0rn
 unic0rn
发布于 2016/07/14 16:31
字数 1093
阅读 28
收藏 1
jni

    Java和C使用JNI通信,所谓通信是指数据上的传递,当Java传递一个String类型给C,C要如何处理?JNI对此提供了一套中间的数据类型。

  1. 基本数据类型
  2. 引用数据类型
  3. 数据类型继承关系
  4. 类描述符
  5. 域描述符
  6. 方法描述符
  7. javap查看方法签名

 

JNI数据类型也分为基本数据类型和引用数据类型

数组都是引用类型,引用类型不能直接使用,要经过JNI函数转换才能使用

 

1.基本数据类型:

JNI

Java

C/C++

jlong

long

有符号64位整型(long)

jint

int

有符号32位整型(int)

jboolean

boolean

无符号8位整型(unsigned char)

jfloat

float

32位浮点型(float)

jdouble

double

64位浮点型(double)

jbyte

byte

有符号8位整型(char)

jshort

short

有符号16位整型(short)

jchar

char

无符号16位整型(unsigned short)

 

2.引用数据类型:

JNI

Java

C/C++

jobject

Object

任何Java对象或没有对应Java类型的对象

jclass

Class

Class类对象

jstring

String

字符串对象

jobjectArray

Object[]

任何对象数组

jbooleanArray

boolean[]

布尔型数组

jbyteArray

byte[]

比特型数组

jcharArray

char[]

字符型数组

jshortArray

short[]

短整型数组

jintArray

int[]

整型数组

jlongArray

long[]

长整型数组

jfloatArray

float[]

浮点型数组

jdoubleArray

double[]

双浮点型数组

void

void

n/a

 

3.数据类型继承关系

 

4.类描述符

 

如果在一个本地方法中,我们要返回一个自定义的User对象怎么办?C中怎么找到Java中的User类?

JNI提供的函数中有个FindClass()就是用来查找Java类的,其参数必须放入一个类描述符字符串

例如User类完整类名为qrsoft.org.User,那么类描述符就是将完整类名的.全部换成/  =>   "qrsoft/org/User"

那么找到User类的代码就是如下:

    jclass userClass = FindClass("qrsoft/org/User");

 

5.域描述符

 

事实证明,FindClass使用域描述也是可行的,即:

jclass userClass = FindClass("qrsoft/org/User"); 

等同jclass userClass = FindClass("Lqrsoft/org/User;"); 

 

什么是域描述符?

域描述符是JNI中对Java数据类型的一种表示方法,虽然有类描述符,但是类描述符里并没有说明基本类型如何表示

在域描述符中已经定义好了基本类型的表示:

 

 

域描述符也定义了数组类型的表示方法:

数组类型的描述符为: [ + 其元素类型的域描述符

如:int[] 描述符为 [I

float[] 描述符为 [F

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

n维数组就有几个[ + 其元素类型的域描述符

如:int[][] 描述符为 [[I

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

 

如果要表示其他类,如同上面String类型一样,引用数据类型为 L + 该类类描述符 + ;

如 Lqrsoft/org/User;

Ljava/lang/String;

 

 

6.方法描述符

 

方法描述符定义了方法的返回值和参数的表示形式

将参数类型的域描述符按声明顺序放入一对括号中(如果没有参数则不需要括号),括号后跟返回值类型的域描述符即形成方法描述符

 

如:

String test();        方法描述符 Ljava/lang/String;

int f(int i, Object object);    方法描述符 (ILjava/lang/Object;)I

void set(byte[] bytes);        方法描述符 ([B)V

 

注意,如果返回值为void,那么方法描述符中使用V表示

 

打开javah生成的头文件,你会发现javah头文件注释中已经生成了本地方法的方法描述符->Signature,所以方法描述符也可以叫做 签名

 

7.javap查看方法签名

javap是jdk自带的一个反编译工具,也可以查看java编译器生成的字节码,在此我们只利用他查看Java方法签名

他的用法如同javah,但命令不同

执行命令javap -s qrsoft.org.Test

你可以查看到该类所有方法签名

 

 

javap也可以配置在eclipse中快捷使用,配置如javah一样,但配置不同

javah配置如下:

 加我QQ:981656164,共同学习交流,记得备注 —— OSC!  ~~ <( ̄3 ̄)> 

© 著作权归作者所有

共有 人打赏支持
unic0rn
粉丝 8
博文 76
码字总数 36275
作品 1
泉州
项目经理
私信 提问
Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android JNI学习(四)——JNI的常用方法的中文API

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android深入理解JNI(二)类型转换、方法签名和JNIEnv

相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换、方法签名和JNIEnv。 1.数据类型的转换 首先给出上一篇文章中and...

刘望舒
2017/07/03
0
0
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android NDK开发之Jni的数据类型

在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥...

zhiweiofli
2013/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用 HostAliases 向 Pod /etc/hosts 文件添加条目

默认 hosts 文件内容 通过 HostAliases 增加额外的条目 限制 为什么 Kubelet 管理 hosts文件? 当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目,可以在 Po...

xiaomin0322
10分钟前
0
0
阿里高级技术专家:研发效能的追求永无止境

背景 大约在5年前,也就是2013年我刚加入阿里的时候,那个时候 DevOps 的风刚吹起来没多久,有家公司宣称能够一天发布几十上百次,这意味着相比传统软件公司几周一次的发布来说,他们响应商业...

阿里云官方博客
12分钟前
0
0
阻止冒泡事件

1、event.isImmediatePropagationStopped() $("#id").click( function(event) { event.isImmediatePropagationStopped()}); 2、event.stopPropagation $("#id").click( function(even......

yan_liu
19分钟前
2
0
shell实例100例《二》

11、题目要求 写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。 显示命令如下: *cmd meau** 1 - date 2 - ls 3 - who 4 - pwd 当输入1时,会运行date, 输入2时运行ls, 以此...

寰宇01
23分钟前
0
0
CentOS开机自启SVN

安装好 svn 服务后,默认是没有随系统启动自动启动的, CentOS 7 的 /etc/rc.d/rc.local 是没有执行权限的, 系统建议创建 systemd service 启动服务 于是查看 systemd 里 svn 的配置文件 /l...

临江仙卜算子
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部