logo资料库

jni 开发 帮助文档 api 适合安卓/Android(中文).doc

第1页 / 共98页
第2页 / 共98页
第3页 / 共98页
第4页 / 共98页
第5页 / 共98页
第6页 / 共98页
第7页 / 共98页
第8页 / 共98页
资料共98页,剩余部分请下载后查看
Java 本地接口规范
1997 年 5 月 16 日
目录
1 - 简介
Java 本地接口概述
背景
JDK 1.0 本地方法接口
Java 运行时接口
原始本地接口和 Java/COM 接口
目标
Java 本地接口方法
利用 JNI 编程
JDK 1.1.2 中的变化
2 - 设计概述
JNI 接口函数和指针
图 2-1 接口指针
加载和链接本地方法
解析本地方法名
表 2-1 Unicode 字符转换
本地方法的参数
代码示例 2-1: 用 C 实现本地方法
代码示例 2-2: 用 C++ 实现本地方法
引用 Java 对象
全局和局部引用
实现局部引用
访问 Java 对象
访问基本类型数组
访问域和方法
报告编程错误
Java 异常
异常和错误代码
异步异常
异常的处理
3 - JNI 的类型和数据结构
基本类型
表 3-1 基本类型和本地等效类型
引用类型
图 3-1 引用类型层次
域 ID 和方法 ID
值类型
类型签名
表 3-2 Java 虚拟机类型签名
UTF-8 字符串
4 - JNI 函数
接口函数表
代码示例 4-1
版本信息
GetVersion
参数
返回值:
类操作
DefineClass
参数:
返回值:
抛出:
FindClass
参数:
返回值:
抛出:
GetSuperclass
参数:
返回值:
IsAssignableFrom
参数:
返回值:
异常
Throw
参数:
返回值:
抛出:
ThrowNew
参数:
返回值:
抛出:
ExceptionOccurred
参数:
返回值:
ExceptionDescribe
参数:
ExceptionClear
参数:
FatalError
参数:
全局及局部引用
NewGlobalRef
参数:
返回值:
DeleteGlobalRef
参数:
DeleteLocalRef
参数:
对象操作
AllocObject
参数:
返回值:
抛出:
NewObjectNewObjectANewObjectV
NewObject
NewObjectA
NewObjectV
参数:
NewObject 的其它参数:
NewObjectA 的其它参数:
NewObjectV 的其它参数:
返回值:
抛出:
GetObjectClass
参数:
返回值:
IsInstanceOf
参数:
返回值:
IsSameObject
参数:
返回值:
访问对象的域
GetFieldID
参数:
返回值:
抛出:
GetField 例程
表 4-1 GetField 访问器例程系列
参数:
返回值:
SetField 例程
表4-2 SetField 访问器例程系列
参数:
调用实例方法
GetMethodID
参数:
返回值:
抛出:
CallMethod 例程CallMethodA 例程Call
CallMethod 例程
CallMethodA 例程
CallMethodV 例程
表 4-3 实例方法调用例程
参数:
CallMethod 例程的其它参数:
CallMethodA 例程的其它参数:
CallMethodV 例程的其它参数:
返回值:
抛出:
CallNonvirtualMethod 例程CallNonvirtual
CallNonvirtualMethod 例程
CallNonvirtualMethodA 例程
CallNonvirtualMethodV 例程
表 4-4 CallNonvirtualMethod 例程
参数:
CallNonvirtualMethod 例程的其它参数:
CallNonvirtualMethodA 例程的其它参数:
CallNonvirtualMethodV 例程的其它参数:
返回值:
调用 Java 方法的结果。
抛出:
访问静态域
GetStaticFieldID
参数:
返回值:
抛出:
GetStaticField 例程
表 4-5 GetStaticField 访问器例程系列
参数:
返回值:
SetStaticField 例程
表4-6 SetStaticField 访问器例程系列
参数:
调用静态方法
GetStaticMethodID
参数:
返回值:
抛出:
CallStaticMethod 例程CallStaticMethodA
CallStaticMethod 例程
CallStaticMethodA 例程
CallStaticMethodV 例程
表 4-7 CallStaticMethod 调用例程
参数:
CallStaticMethod 例程的其它参数:
CallStaticMethodA 例程的其它参数:
CallStaticMethodV 例程的其它参数:
返回值:
抛出:
字符串操作
NewString
参数:
返回值:
抛出:
GetStringLength
参数:
返回值:
GetStringChars
参数:
返回值:
ReleaseStringChars
参数:
NewStringUTF
参数:
返回值:
抛出:
GetStringUTFLength
参数:
返回值:
GetStringUTFChars
参数:
返回值:
ReleaseStringUTFChars
参数:
数组操作
GetArrayLength
参数:
返回值:
NewObjectArray
参数:
返回值:
抛出:
GetObjectArrayElement
参数:
返回值:
抛出:
SetObjectArrayElement
参数:
抛出:
NewArray 例程
表 4-8 NewArray 数组构造函数系列
参数:
返回值:
GetArrayElements 例程
表4-9 GetArrayElements 访问器例程系列
参数:
返回值:
ReleaseArrayElements 例程
表 4-10 基本类型数组释放模式
表 4-11 ReleaseArrayElements 数组例程系列
参数:
GetArrayRegion 例程
表 4-12 GetArrayRegion 数组访问器例程系列
参数:
抛出:
SetArrayRegion 例程
表 4-13 SetArrayRegion 数组访问器例程系列
参数:
抛出:
注册本地方法
RegisterNatives
参数:
返回值:
抛出:
UnregisterNatives
参数:
返回值:
监视程序操作
MonitorEnter
参数:
返回值:
MonitorExit
参数:
返回值:
Java 虚拟机接口
GetJavaVM
参数:
返回值:
5 - 调用 API
概述
创建虚拟机
连接虚拟机
卸载虚拟机
初始化结构
调用 API 函数
JNI_GetDefaultJavaVMInitArgs
参数:
返回值:
JNI_GetCreatedJavaVMs
参数:
返回值:
JNI_CreateJavaVM
参数:
返回值:
DestroyJavaVM
参数:
返回值:
AttachCurrentThread
参数:
返回值:
DetachCurrentThread
参数:
返回值:
Java 本地接口规范 Java 本地接口规范 1997 年 5 月 16 日 目录 1. 简介 Java 本地接口概述 背景 JDK 1.0 本地方法接口 Java 运行时接口 原始本地接口和 Java/COM 接口 目标 Java 本地接口方法 利用 JNI 编程 JDK 1.1.2 中的变化 2. 设计概述
JNI 接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用 Java 对象 全局和局部引用 实现局部引用 访问 Java 对象 访问基本类型数组 访问域和方法 报告编程错误 Java 异常 异常和错误代码 异步异常 异常的处理
3. JNI 的类型和数据结构 基本类型 引用类型 域 ID 和方法 ID 值类型 类型签名 UTF-8 字符串 4. JNI 函数 接口函数表 版本信息 GetVersion 类操作 DefineClass FindClass GetSuperclass IsAssignableFrom 异常 Throw ThrowNew ExceptionOccurred
ExceptionDescribe ExceptionClear FatalError 全局及局部引用 NewGlobalRef DeleteGlobalRef DeleteLocalRef 对象操作 AllocObject GetObjectClass IsInstanceOf IsSameObject 访问对象的域 GetFieldID GetField 例程 SetField 例程 调用实例方法 GetMethodID CallMethod CallNonvirtualMethod 访问静态域 GetStaticFieldID GetStaticField 例程
SetStaticField 例程 调用静态方法 GetStaticMethodID CallStaticMethod 字符串操作 NewString GetStringLength GetStringChars ReleaseStringChars NewStringUTF GetStringUTFLength GetStringUTFChars ReleaseStringUTFChars 数组操作 GetArrayLength NewObjectArray GetObjectArrayElement SetObjectArrayElement NewArray 例程 GetArrayElements 例程 ReleaseArrayElements 例程 GetArrayRegion 例程 SetArrayRegion 例程
注册本地方法 RegisterNatives UnregisterNatives 监视程序操作 MonitorEnter MonitorExit Java 虚拟机接口 GetJavaVM 5. 调用 API 概述 创建虚拟机 连接虚拟机 卸载虚拟机 初始化结构 调用 API 函数 JNI_GetDefaultJavaVMInitArgs JNI_GetCreatedJavaVMs JNI_CreateJavaVM DestroyJavaVM
AttachCurrentThread DetachCurrentThread 1 - 简介 本章介绍 Java 本地接口(Java Native Interface,JNI)。JNI 是本地编程接口。它使 得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、 C++ 和汇编语言)编写的应用程序和库进行互操作。 JNI 最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。因此,Java 虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对 JNI 的支持。程序员只 需编写一种版本的本地应用程序或库,就能够与所有支持 JNI 的 Java 虚拟机协 同工作。 本章论及以下主题:  Java 本地接口概述  背景  目标  Java 本地接口方法  利用 JNI 编程  JDK1.1.2 中的变化 Java 本地接口概述 尽管可以完全用 Java 编写应用程序,但是有时单独用 Java 不能满足应用程序 的需要。程序员使用 JNI 来编写 Java 本地方法,可以处理那些不能完全用 Java 编写应用程序的情况。 以下示例说明了何时需要使用 Java 本地方法:
 标准 Java 类库不支持与平台相关的应用程序所需的功能。  已经拥有了一个用另一种语言编写的库,而又希望通过 JNI 使 Java 代码 能够访问该库。  想用低级语言(如汇编语言)实现一小段时限代码。 通过用 JNI 编程,可以将本地方法用于:  创建、检查及更新 Java 对象(包括数组和字符串)。  调用 Java 方法。  捕捉和抛出异常。  加载类和获得类信息。  执行运行时类型检查。 也可以与调用 API 一起使用 JNI,以允许任意本地应用程序嵌入到 Java 虚拟机 中。这样使得程序员能够轻易地让已有应用程序支持 Java,而不必与虚拟机源代 码相链接。 背景 目前,不同厂商的虚拟机提供了不同的本地方法接口。这些不同的接口使程序员不 得不在给定平台上编写、维护和分发多种版本的本地方法库。 下面简要分析一下部分已有本地方法接口,例如: JDK 1.0 本地方法接口   Netscape 的 Java 运行时接口  Microsoft 的原始本地接口和 Java/COM 接口 JDK 1.0 本地方法接口 JDK 1.0 附带有本地方法接口。遗憾的是,有两点原因使得该接口不适合于其它 Java 虚拟机。
分享到:
收藏