IntelliJ IDEA平台下JNI编程(二)—类型映射

简介: IntelliJ IDEA平台下JNI编程(二)—类型映射

IntelliJ IDEA平台下JNI编程(二)—类型映射


转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53992258

这篇文章是直接从《The Java™ Native Interface Programmer’s Guide and Specification》中整理,可以前往http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html中查阅。本文只是作为参考用,并不涉及到深层次的技术。主要是为了后面学习过程中能快速查阅,花半分钟浏览一下即可。

1. JNI类型映射

1.1 基本类型

image.png

1.2 引用类型映射

微信图片_20221214193107.png

1.3 jvalue类型

jvalue类型为联合体union类型,它的定义如下:

typedef union jvalue {
    jboolean z;
    jbyte b;
    jchar c;
    jshort s;
    jint i;
    jlong j;
    jfloat f;
    jdouble d;
    jobject l;
} jvalue; 

2. 描述符

JNI中使用C语言中的字符串来表示类的名称(class name)、域(field)、方法名以及域和方法描述,这些字符串都是UTF-8编码格式。

2.1 类描述符

类描述符用于描述类或接口名,比如描述java.lang.String类,使用java/lang/String来表示。对于数组类型,则通过[前缀来描述,比如一维数组类型int[],则使用[I表示;二维数组int[][] 则使用[[I表示;甚至三维数组double[][][],则用[[[D表示。

2.2 域描述符(Field descriptors )

八种基本类型对应的域描述符如下:

image.png

引用类型的域描述符以字符L开头,再连接引用类型对应的类描述符,最后以分号;结尾。数组类型则是先以[开头,再按照域描述符规则组成,例如:

image.png

2.3 方法描述符(Method descriptors)

方法描述符是描述一个方法(或者说函数),主要描述方法的参数和返回类型,都是通过域描述符进行描述,方法描述符的构成为(形参对应的域描述符)返回类型对应域描述符。并且各个描述符之间没有空格和逗号或者是其他类型的间隔符号。字符V用于表示返回类型为void,而构造函数使用V表示他们的返回类型并且使用<init>作为名字,下表为简单示例:

image.png

3. 宏定义

3.1 JNIEXPORT 与JNICALL

JNIEXPORT 和 JNICALL 都是宏定义,用于指定JNI函数和本地方法实现之间的调用和链接规则。必须将JNIEXPORT放在函数的返回类型之前,将JNICALL放在函数名称与返回类型之间。例如:

JNIEXPORT jint JNICALL Java_pkg_Cls_f(JNIEnv *env, jobject this);

上面为C语言对Java中pkg.Cls.f函数的具体实现对应的函数原型。定义指向Java_pkg_Cls_f函数的指针变量可以如下:

jint (JNICALL *f_ptr)(JNIEnv *env, jobject this);

3.2 JNI_FALSEJNI_TRUE

JNI_FALSEand JNI_TRUE 是定义jboolean类型的两个常量 :

#define JNI_FALSE 0
#define JNI_TRUE 1

3.3JNI_OKJNI_ERR

JNI_OK表示JNI函数成功返回, JNI_ERR有时用于表示错误。

#define JNI_OK 0
#define JNI_ERR (-1)

并非所有的错误情况都是使用JNI_ERR,因为JNI并不指定错误码集合,而是返回JNI_OK表示JNI函数成功返回,返回负数表示函数执行失败。

3.4 JNI_COMMIT与JNI_ABORT

JNI_COMMIT与JNI_ABORT两个常量被用于函数中,释放本地拷贝的基本类型数组。JNI_COMMIT 强制要求本地数组数据拷贝至JVM中对应的数组,JNI_ABORT则释放本地数组占用的内存空间,并且不作为新返回数据拷贝至JVM中对应的数组。

#define JNI_COMMIT 1
#define JNI_ABORT 2 


相关文章
|
4月前
|
Java 编译器 Maven
使用intellij idea搭建SSM架构的maven项目 详细
使用intellij idea搭建SSM架构的maven项目 详细
78 4
|
3月前
|
IDE Oracle Java
day4:JDK、IntelliJ IDEA的安装和环境变量配置
【7月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
173 0
|
2月前
|
Java
问题2:IDEA控制台输出中文乱码以及出现错误(编码 GBK 的不可映射字符 (0xB0))的解决办法
问题2:IDEA控制台输出中文乱码以及出现错误(编码 GBK 的不可映射字符 (0xB0))的解决办法
448 4
|
3月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
63 3
|
4月前
|
分布式计算 Hadoop Java
MapReduce编程模型——在idea里面邂逅CDH MapReduce
MapReduce编程模型——在idea里面邂逅CDH MapReduce
70 15
|
3月前
|
网络协议 安全 Linux
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
73 2
|
4月前
|
IDE Java Scala
IntelliJ IDEA 2023.3 最新变化2
IntelliJ IDEA 2023.3 最新变化
|
4月前
|
Linux 开发工具 Windows
在WSL2中安装IntelliJ IDEA开发工具
在WSL2中安装IntelliJ IDEA开发工具
403 2
|
3月前
|
缓存 Java Maven
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
104 0
|
3月前
|
存储 Oracle Java
Java面试题:描述如何使用Eclipse或IntelliJ IDEA进行Java开发?
Java面试题:描述如何使用Eclipse或IntelliJ IDEA进行Java开发?
43 0

相关课程

更多