您的位置:首页 > 编程语言

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

2017-01-12 17:08 309 查看
转载请注明出处:【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 基本类型

Java Language TypeNative TypeDescription
booleanjbooleanunsigned 8 bits
bytejbytesigned 8 bits
charjcharunsigned 16 bits
shortjshortsigned 16 bits
intjintsigned 32 bits
longjlongsigned 64 bits
floatjfloat32 bits
doublejdouble64 bits

1.2 引用类型映射



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 )

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

Field DescriptorJava Language Type
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
引用类型的域描述符以字符
L
开头,再连接引用类型对应的类描述符,最后以分号
;
结尾。数组类型则是先以
[
开头,再按照域描述符规则组成,例如:

Field DescriptorJava Language Type
"Ljava/lang/String;"
String
"[I"
int[]
"[Ljava/lang/Object;"
Object[]

2.3 方法描述符(Method descriptors)

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

Method DescriptorJava Language Type
"()Ljava/lang/String;"
String f();
"(ILjava/lang/Class;)J"
long f(int i, Class c);
`"([B)V"
String(byte[] bytes);

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_FALSE
JNI_TRUE

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

#define JNI_FALSE 0
#define JNI_TRUE 1


3.3
JNI_OK
JNI_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JNI intellij idea