文档章节

四、JNI数据类型

unic0rn
 unic0rn
发布于 2016/07/14 16:31
字数 1093
阅读 25
收藏 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学习(四)——JNI的常用方法的中文API

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

隔壁老李头
05/09
0
0
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(一)——NDK与JNI基础

本系列文章如下: 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 NDK开发之Jni的数据类型

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

zhiweiofli
2013/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

epoll中使用

1、一个线程epoll_wait时,另一个线程调用epoll_ctl是安全的。 2、使用edge触发,在socket有数据到来后,不收取数据,再次调用epoll_ctl将socket加入,仍会触发下一次动作。 asio用该方法来发...

gelare
19分钟前
1
0
PHP规范PSR2

PSR标准 - PSR-2 为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。 各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作...

geek土拨鼠
34分钟前
5
0
【极简】如何在服务器上安装SSL证书?

本文适合任何人了解,图形化操作。下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板。 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待...

皇冠小丑
43分钟前
1
0
深入理解编译器

深入理解编译器 原文出处 欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示 1 Rust中文社区首页 2 Rust中文社区Rust文章栏目 3 知乎专栏Rust语言 编程语言是如何工作的 从内部理解...

krircc
44分钟前
1
0
Centos7&docker-ce&compose&wordpress

如题,最近帮人装个WordPress,想起来用docker方便,这里做个记录。 因为docker要求linux内核版本3.10以上我记得,所以直接用的centos7省去很多麻烦。 主机在国内的先把yum源改成国内的阿里云...

虚拟世界的懒猫
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部