Java JNI(Java Native Interface)
摘自:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/;
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html
Java JNI(Java Native Interface)分两部分:
JNI 基础部分:jni.h
JNI 增强部分:The AWT Native Interface,Header Files for jawt.h and jawt_md.h
以下是对学习基础部分的一些笔记:
Java 基本数据类型与JNI基本数据类型对应关系;
在C++,所有其它JNI引用类型都被定义为jobject中是相同的。例如:
typedef jobject jclass;
class _jobject {};
class _jclass : public _jobject {};
...
typedef _jobject *jobject;
typedef _jclass *jclass;
JNI中的域和方法ID声明:
struct _jfieldID; /* opaque structure */
typedef struct _jfieldID *jfieldID; /* field IDs */
struct _jmethodID; /* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */
---------------------------------------------------
JNI中的联合类型声明:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
类型签名:
For example, the Java method:
long f (int n, String s, int[] arr);
has the following type signature:
(ILjava/lang/String;[I)J
---------------------------------------------------
jobject类型的功能
---------------------------------------------------
JNI本地接口结构体(JNIEnv是操作本地代码逻辑功能)
JNIEnv的类型是一个指针存储所有JNI函数指针的结构。它被定义为如下:
typedef const struct JNINativeInterface *JNIEnv;
const struct JNINativeInterface ... = {
NULL,
NULL,
NULL,
NULL,
GetVersion,
DefineClass,
FindClass,
FromReflectedMethod,
FromReflectedField,
...
}
---------------------------------------------------
调用API允许软件厂商将Java虚拟机加载到任意的本地应用程序:
(以下结构体和函数是对虚拟机的一些操作功能)
JNI的调用接口结构体
JavaVM类型是一个指针,调用API函数表。下面的代码示例显示此功能表。
typedef const struct JNIInvokeInterface *JavaVM;
const struct JNIInvokeInterface ... = {
NULL,
NULL,
NULL,
DestroyJavaVM,
AttachCurrentThread,
DetachCurrentThread,
GetEnv,
AttachCurrentThreadAsDaemon
};
返回的Java虚拟机的缺省配置:
JNI_GetDefaultJavaVMInitArgs(void *args);
加载和初始化Java虚拟机。当前线程成为主线程。 env参数设置主线程的JNI界面指针:
JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
返回所有已创建的Java虚拟机:
JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
VM呼叫JNI_OnLoad当本机库加载(例如,通过System.loadLibrary方法):
JNI_OnLoad(JavaVM *vm, void *reserved);
JNI_OnLoad必须返回的JNI版本的原生库所需要的。
虚拟机将调用JNI_OnUnload时包含本地库中的类加载器被垃圾收集:
JNI_OnUnload(JavaVM *vm, void *reserved);
此功能可以用来执行清理操作。
需要注意的是JNI_OnLoad和的JNI_OnUnload两种功能可提供的JNI库的VM,而不是出口。
---------------------------------------------------
结束语:对于JNI的用法,只要掌握3个对象的使用JNIEnv,JavaVM,jobject.
JNI对外公开的函数比较重要的:
JNIEnv,JavaVM,jobject;
JNI_GetDefaultJavaVMInitArgs(void *args);
JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
JNI_OnLoad(JavaVM *vm, void *reserved);
JNI_OnUnload(JavaVM *vm, void *reserved);
---------------------------------------------------
摘自:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/;
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html
Java JNI(Java Native Interface)分两部分:
JNI 基础部分:jni.h
JNI 增强部分:The AWT Native Interface,Header Files for jawt.h and jawt_md.h
以下是对学习基础部分的一些笔记:
Java 基本数据类型与JNI基本数据类型对应关系;
在C++,所有其它JNI引用类型都被定义为jobject中是相同的。例如:
typedef jobject jclass;
class _jobject {};
class _jclass : public _jobject {};
...
typedef _jobject *jobject;
typedef _jclass *jclass;
JNI中的域和方法ID声明:
struct _jfieldID; /* opaque structure */
typedef struct _jfieldID *jfieldID; /* field IDs */
struct _jmethodID; /* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */
---------------------------------------------------
JNI中的联合类型声明:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
类型签名:
For example, the Java method:
long f (int n, String s, int[] arr);
has the following type signature:
(ILjava/lang/String;[I)J
---------------------------------------------------
jobject类型的功能
---------------------------------------------------
JNI本地接口结构体(JNIEnv是操作本地代码逻辑功能)
JNIEnv的类型是一个指针存储所有JNI函数指针的结构。它被定义为如下:
typedef const struct JNINativeInterface *JNIEnv;
const struct JNINativeInterface ... = {
NULL,
NULL,
NULL,
NULL,
GetVersion,
DefineClass,
FindClass,
FromReflectedMethod,
FromReflectedField,
...
}
---------------------------------------------------
调用API允许软件厂商将Java虚拟机加载到任意的本地应用程序:
(以下结构体和函数是对虚拟机的一些操作功能)
JNI的调用接口结构体
JavaVM类型是一个指针,调用API函数表。下面的代码示例显示此功能表。
typedef const struct JNIInvokeInterface *JavaVM;
const struct JNIInvokeInterface ... = {
NULL,
NULL,
NULL,
DestroyJavaVM,
AttachCurrentThread,
DetachCurrentThread,
GetEnv,
AttachCurrentThreadAsDaemon
};
返回的Java虚拟机的缺省配置:
JNI_GetDefaultJavaVMInitArgs(void *args);
加载和初始化Java虚拟机。当前线程成为主线程。 env参数设置主线程的JNI界面指针:
JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
返回所有已创建的Java虚拟机:
JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
VM呼叫JNI_OnLoad当本机库加载(例如,通过System.loadLibrary方法):
JNI_OnLoad(JavaVM *vm, void *reserved);
JNI_OnLoad必须返回的JNI版本的原生库所需要的。
虚拟机将调用JNI_OnUnload时包含本地库中的类加载器被垃圾收集:
JNI_OnUnload(JavaVM *vm, void *reserved);
此功能可以用来执行清理操作。
需要注意的是JNI_OnLoad和的JNI_OnUnload两种功能可提供的JNI库的VM,而不是出口。
---------------------------------------------------
结束语:对于JNI的用法,只要掌握3个对象的使用JNIEnv,JavaVM,jobject.
JNI对外公开的函数比较重要的:
JNIEnv,JavaVM,jobject;
JNI_GetDefaultJavaVMInitArgs(void *args);
JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
JNI_OnLoad(JavaVM *vm, void *reserved);
JNI_OnUnload(JavaVM *vm, void *reserved);
---------------------------------------------------