赞
踩
JNI数据类型
1、JNI(JavaNative Interface),中文为Java本地调用。
2、JNI设计目的:允许JAVA代码与其它语言进行交互。
3、JNI数据类型和数据结构
1、基本类型
JAVA类型 | 本地类型 | C/C++类型 |
boolean | jboolean | unsignedchar |
byte | jbyte | signedchar |
char | jchar | unsignedshort |
short | jshort | short |
int | jint,jsize | int |
long | jlong | long(longlong) |
float | jfloat | float |
double | jdouble | double |
void | void | void |
2、常用数据类型和指针类型
#ifdef__cplusplus
class_jobject {};
class_jclass : public _jobject {};
class_jthrowable : public _jobject {};
class_jstring : public _jobject {};
class_jarray : public _jobject {};
class_jbooleanArray : public _jarray {};
class_jbyteArray : public _jarray {};
class_jcharArray : public _jarray {};
class_jshortArray : public _jarray {};
class_jintArray : public _jarray {};
class_jlongArray : public _jarray {};
class_jfloatArray : public _jarray {};
class_jdoubleArray : public _jarray {};
class_jobjectArray : public _jarray {};
typedef_jobject *jobject;
typedef_jclass *jclass;
typedef_jthrowable *jthrowable;
typedef_jstring *jstring;
typedef_jarray *jarray;
typedef_jbooleanArray *jbooleanArray;
typedef_jbyteArray *jbyteArray;
typedef_jcharArray *jcharArray;
typedef_jshortArray *jshortArray;
typedef_jintArray *jintArray;
typedef_jlongArray *jlongArray;
typedef_jfloatArray *jfloatArray;
typedef_jdoubleArray *jdoubleArray;
typedef_jobjectArray *jobjectArray;
#else
struct_jobject;
typedefstruct _jobject *jobject;
typedefjobject jclass;
typedefjobject jthrowable;
typedefjobject jstring;
typedefjobject jarray;
typedefjarray jbooleanArray;
typedefjarray jbyteArray;
typedefjarray jcharArray;
typedefjarray jshortArray;
typedefjarray jintArray;
typedefjarray jlongArray;
typedefjarray jfloatArray;
typedefjarray jdoubleArray;
typedefjarray jobjectArray;
#endif
上述数据类型只能和相应的函数配合使用,单独使用没有意义。
3、JNI复合型的类型jvalue,它能够表达所有的简单和引用类型,常用于不确定的参数传递。
typedefunion jvalue
{
jbooleanz;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
}jvalue;
例如: jobject(JNICALL *NewObjectA)
(JNIEnv*env, jclass clazz, jmethodID methodID, const jvalue*args);
4、不透明类型(opaquedatastructure),在头文件只有声明,具体的定义在C/C++源文件中。使用者无法知道该数据类型的大小,所以该数据类型最好以指针的形式来使用;否则会给编码和程序运行带来不确定性。主要类型如下:
struct_jfieldID;
typedefstruct _jfieldID *jfieldID;
jfieldID主要用来储存java端的变量地址
struct_jmethodID;
typedefstruct _jmethodID *jmethodID;
jmethodID主要用来储存java端的方法地址
5、Java和 C函数的映射表数组
/*
* used in RegisterNatives to describe native method name, signature,
* and function pointer.
*/
typedefstruct {
char*name; //Java中函数的名字。
char*signature; //用字符串是描述了函数的参数和返回值
void*fnPtr; //指向C函数
}JNINativeMethod;
签名字符串和JAVA中的数据类型对应关系如下:
类型签名 | Java类型 |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L | fully-qualified-class(全限定的类) |
[ | [] |
[I | int[] |
[F | float[] |
[B | byte[] |
[C | char[] |
[S | short[] |
[D | double[] |
[J | long[] |
[Z | boolean[] |
函数签名例子:
1、JAVA中的函数定义:
inttestLocalData(int iData, String[] args, int[] iValue);
2、签名表示:
(I[Ljava/lang/String;[I)I
如果Java函数的参数是class,则以"L"开头,以";"结尾中间是用"/"隔开的包及类名。如 果JAVA函数参数位于一个嵌入类,则用$作为类名间的分隔符。
6、JNI本地方法接口
/*
*JNI Native Method Interface.
*/
structJNINativeInterface_;
structJNIEnv_;
#ifdef__cplusplus
typedefJNIEnv_ JNIEnv;
#else
typedefconst struct JNINativeInterface_ *JNIEnv;
#endif
7、JNI调用接口
/*
*JNI Invocation Interface.
*/
structJNIInvokeInterface_;
structJavaVM_;
#ifdef__cplusplus
typedefJavaVM_ JavaVM;
#else
typedefconst struct JNIInvokeInterface_ *JavaVM;
#endif
8、运行Java虚拟机的配置
typedefstruct JavaVMOption {
char*optionString;
void*extraInfo;
}JavaVMOption;
9、初始化JAVA虚拟机参数
typedefstruct JavaVMInitArgs {
jintversion;
jintnOptions;
JavaVMOption*options;
jbooleanignoreUnrecognized;
}JavaVMInitArgs;
10、创建线程的参数
typedefstruct JavaVMAttachArgs {
jintversion;/*JNI version*/
char*name; /* the name of the thread as a modified UTF-8 string, orNULL */
jobjectgroup; /* global ref of a ThreadGroup object, or NULL */
}JavaVMAttachArgs;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。