四、JNI数据类型
博客专区 > unic0rn 的博客 > 博客详情
四、JNI数据类型
unic0rn 发表于1年前
四、JNI数据类型
  • 发表于 1年前
  • 阅读 13
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: Java和C使用JNI通信,所谓通信是指数据上的传递,当Java传递一个String类型给C,C要如何处理?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 ̄)> 

标签: jni
共有 人打赏支持
粉丝 8
博文 75
码字总数 35725
作品 1
×
unic0rn
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: