文档章节

四、JNI数据类型

unic0rn
 unic0rn
发布于 2016/07/14 16:31
字数 1093
阅读 22
收藏 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的常用方法...

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

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

隔壁老李头
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的常用方法...

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

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

zhiweiofli
2013/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
20分钟前
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
42分钟前
3
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
50分钟前
1
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
21
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部