Java JNI(Java Native Interface)

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);
---------------------------------------------------





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值