Java本地调用JNI使用规范详解.doc
文本预览下载声明
Java本地调用JNI使用规范详解
一、 JNI概述
JavaNative Interface的缩写,中文为Java本地调用。从Java1.1开始,JNI即成为Java标准的一部分。
JNI设计的目的是为了允许Java代码与其他语言进行交互。但这样做通常会导致丧失平台可移植性,通常是在特定的需求下进行,例如使用旧的其他语言的库、需要获得Java类库不支持的某种基于具体平台的特性、大量数学计算性能优化等。
二、 JNI数据类型和数据结构
1.基本类型
JNI基本类型和本地等效类型的对应表格如下:
Java类型
本地类型
说明
boolean
jboolean
无符号,8位
byte
jbyte
无符号,8位
char
jchar
无符号,16位
short
jshort
有符号,16位
int
jint
有符号,32位
long
jlong
有符号,64位
float
jfloat
32位
double
jdouble
64位
void
void
无
为了使用方便,还提供了如下定义:
#define JNI_FALSE 0
#define JNI_TRUE 1
Jsize类型用于描述主要指数和大小:
typedef jint jsize;
2.引用类型
除了基本类型外,JNI还包含了很对对应于不同Java对象的引用类型,JNI引用类型的组织层次如下图所示:
在C语言中,所有其他JNI引用类型都被定义为与jobject一样,例如:
typedef jobject jclass;
在C++中,JNI引入虚构类以加强子类关系,例如:
class _jobject{};
class _jstring : public jobject{};
…
typedef _jobject jobject;
typedef _jstring jstring;
3.方法ID和域ID
方法ID和域ID是常规的C指针类型:
struct_jmethodID; /*不透明结构*/
typedefstruct _jmethodID *jmethodID; /*方法ID*/
struct_jfieldID; /*不透明结构*/
typedefstruct _jfieldID *jfieldID /*域ID*/
4.值类型
jvalue联合在参数数组中用作单元类型,其声明如下:
typedefunion _jvalue
{
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
}jvalue;
5.UTF8字符串
JNI的UTF8字符串与标准UTF8格式有两个区别,第一,空字节0使用双字节格式进行编码,而不是标准UTF8的单字节;第二,只使用单字节、双字节和三字节格式,不支持更长的字节格式。
三、 JNI接口函数命名方式
1. 类型签名
Java虚拟机的类型签名如下:
类型签名
Java类型
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
float
D
double
Lfully-qulitied-class;
全限定类
[type
type[] 数组
(argtypes)rettype
方法类型
例如,Java方法int feet(int n, String s,int [] arr)的类型签名如下:
(ILJava/lang/String;[I)I
圆括号里面为参数,I表示第一个参数int型,LJava/lang/String;表示第二个参数为全限定Java.lang.String类型,[I表示第三个参数为int型的数组,圆括号后面为返回值类型,I表示返回值为int型。
2. 一般函数的JNI接口函数命名方式
一般JNI接口函数命名如下:
Java_包名_类名_方法名。
例如:某工程下Sample/test包下MySigal类的int GetASample()方法的C语言实现函数命名如下:
jint Java_Sample_test_MySigal_GetASample(JNIEnv* env,jobjectobj)
其中,包名所包含的“/”应全部以下划线替代,其本地实现的参数和返回值也应转换为JNI类型。
3. 重载函数的JNI接口函数命名方式
重载函数的JNI实现在一般函数的JNI实现之外,还应添加上类型签名以作为同名函数之间的区别,其接口函数命名如下:
Java_包名_类名_方法名_参数签名。
例如:某工程下Sample/test包下MySigal类的int GetASample(int n, String s
显示全部