jni讲解(理论)——美斯坦福

上传人:小** 文档编号:44410148 上传时间:2018-06-09 格式:PPT 页数:26 大小:1.85MB
返回 下载 相关 举报
jni讲解(理论)——美斯坦福_第1页
第1页 / 共26页
jni讲解(理论)——美斯坦福_第2页
第2页 / 共26页
jni讲解(理论)——美斯坦福_第3页
第3页 / 共26页
jni讲解(理论)——美斯坦福_第4页
第4页 / 共26页
jni讲解(理论)——美斯坦福_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《jni讲解(理论)——美斯坦福》由会员分享,可在线阅读,更多相关《jni讲解(理论)——美斯坦福(26页珍藏版)》请在金锄头文库上搜索。

1、Jni理论知识讲解讲解内容uJni简介uJni设计概述uJni函数uJni类型和数据结构 u调用 API 函数 1.简介uJni产生的背景u什么是JniuJava本地接口概述uJava本地接口的方法u利用Jni编程1.1jni产生的背景u应用程序需要使用系统相关的功能,而Java代码不支持或是难以办到 。u已有其他语言写好的类库或程序,希望Java程序可以使用它们Java本 地接口的方法u出于更高的性能要求,希望使用汇编或是C/C+语言来实现部分功能1.2什么是JniuJava 本地接口(Java Native Interface,JNI)。JNI 是本地编程接口 。它使得在 Java 虚拟机

2、 (VM) 内部运行的 Java 代码能够与用其它编 程语言(如 C、C+ 和汇编语言)编写的应用程序和库进行互操作u从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部 分,它允许Java代码和其他语言写的代码进行交互uJNI一开始是为了本地已编译语言,尤其是C和C+而设计的,但是它 并不妨碍你使用其他语言,只要调用约定受支持就可以了uJAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的( 在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机 器的紧密

3、联系,调用系统级的各接口方法1.2 Java本地接口概述u调用java本地方法的时机n标准 Java 类库不支持与平台相关的应用程序所需的功能n已经拥有了一个用另一种语言编写的库,而又希望通过 JNI 使 Java 代码能够访问该 库n想用低级语言(如汇编语言)实现一小段时限代码u通过用 JNI 编程,可以将本地方法用于n创建、检查及更新 Java 对象(包括数组和字符串)。n调用 Java 方法。n捕获或抛出异常。n加载类和获得类信息。n执行运行时类型检查。u现今部分已有本地方法接口: nJDK 1.0 本地方法接口nNetscape 的 Java 运行时接口nMicrosoft 的原始本地

4、接口和 Java/COM 接口1.4目标u标准接口能够向每个用户提供以下好处n每个虚拟机厂商都可以支持更多的平台相关代码n工具构造器不必维护不同的本地方法接口n应用程序设计人员可以只编写一种版本的平台相关代码就能够在不同的虚 拟机上运行u标准本地方法接口必须满足以下要求n二进制兼容性n效率n功能1.5利用 JNI 编程u利用 JNI 编程隔离了一些未知条件u遵守 JNI 标准是本地库能在给定 Java 虚拟机上运行的最好保证u实现JNI能确保 它不会占用虚拟机实现的系统开销或施加任何限制,包 括对象表示,垃圾收集机制等2. Jni设计概述uJNI 接口函数和指针u加载和链接本地方法u引用 Ja

5、va 对象u访问 Java 对象u报告编程错误u异常2.1 JNI 接口函数和指针u含义: nJNI 函数可通过接口指针来获得n针是指针的指针,它指向一个指针数组,而指针数组中的每个元素又指向 一个接口函数n每个接口函数都处在数组的某个预定偏移量中u虚拟机可支持以下两个 JNI 函数表: n一个表对非法参数进行全面检查,适用于调试程序n另一个表只进行 JNI 规范所要求的最小程度的检查,因此效率较高2.2加载和链接本地方法u解析本地方法名n前缀 Java_nmangled 全限定的类名n下划线(“_”)分隔符nmangled 方法名n对于重载的本地方法,加上两个下划线(“_”),后跟 mang

6、led 参数签名n如:java_(包名)_class_methodu字符转换转义字符序列 表示 _0XXXX Unicode 字符 XXXX。_1 字符“_” _2 签名中的字符“;” _3 签名中的字符“”2.3本地方法的参数u第一个参数:JNI 接口指针u第二个参数(非静态本地方法:对象的引用、静态本地方法:其 Java 类的引用)u其余的参数对应于通常 Java 方法的参数u定义本地方法: package pkg;class Cls native double f(int i, String s); . u用 C 实现本地方法jdouble Java_pkg_Cls_f_ILjava_l

7、ang_String_2 ( JNIEnv *env, /* 接口指针 */ jobject obj, /* “this”指针 */ jint i, /* 第一个参数 */ jstring s) /* 第二个参数 */ /* 取得 Java 字符串的 C 版本 */ const char *str = (*env)-GetStringUTFChars(env, s, 0); /* 处理该字符串 */ . /* 至此完成对 str 的处理 */(*env)-ReleaseStringUTFChars(env, s, str); return . u用 C+ 实现本地方法extern “C“ /*

8、 指定 C 调用约定 */ jdouble Java_pkg_Cls_f_ILjava_lang_String_2 ( JNIEnv *env, /* 接口指针 */ jobject obj, /* “this”指针 */ jint i, /* 第一个参数 */ jstring s) /* 第二个参数 */ const char *str = env-GetStringUTFChars(s, 0); . env-ReleaseStringUTFChars(s, str); return . 2.4引用 Java 对象u局部引用:局部引用在本地方法调用期间有效,并在本地方法返回后被 自动释放掉u

9、全局引用:将一直有效,直到被显式释放u实现局部应用nJava 虚拟机为每个从 Java 到本地方法的控制转换都创建了注册服务程序2.5访问 Java 对象u访问基本类型数组nJni提供了一套函数,用于在 Java 数组的一部分和本地内存缓冲之间复制基本 类型数组元素n程序员可用另一套函数来取回数组元素的受约束版本n接口提供了一些函数,用以通知虚拟机本地方法已不再需要访问这些数组元素n钉住:(1)垃圾收集器必须支持钉住(2)虚拟机必须在内存中连续存放基本类型数组u访问域和方法n保留对所涉及类的活引用n重新计算该方法 ID 或域 IDn获得方法id的方法:jmethodID mid = env-G

10、etMethodID(cls, “f“,“(ILjava/lang/String;)D“); 重复调用的方法:jdouble result = env-CallDoubleMethod(obj, mid, 10, str); 2.6报告编程错误u强迫 JNI 函数去检查所有可能的错误情况将降低正常(正确)的本地方 法的性能u在许多情况下,没有足够的运行时的类型信息可供这种检查使用uJNI 不检查诸如传递 NULL 指针或非法参数类型之类的编程错误2.7 异常u异常和错误代码n快速检查上一个 JNI 调用所返回的值以确定是否出错n通过调用函数 ExceptionOccurred() 来获得异常对

11、象,它含有对错误情况的更 详细说明n调用 Java 方法的 JNI 函数返回该 Java 方法的结果。程序员必须调用 ExceptionOccurred() 以检查在执行 Java 方法期间可能发生的异常n某些用于访问 JNI 数组的函数并不返回错误代码,但可能会抛出 ArrayIndexOutOfBoundsException 或 ArrayStoreExceptionu异步异常(在多个线程的情况下,当前线程以外的其它线程可能会抛出异步异常)n该平台相关代码调用某个有可能抛出同步异常的 JNI 函数n该平台相关代码用 ExceptionOccurred() 显式检查同步异常或异步异常准备数

12、据库的驱动程序u异常的处理n本地方法可选择立即返回,使异常在启动该本地方法调用的 Java 代码中抛出n平台相关代码可通过调用 ExceptionClear() 来清除异常,然后执行自己的异 常处理代码3.jni函数函数 描述NeString利用 Unicode 字符数组构造新的 java.lang.String 对象GetStringLength 返回 Java 字符串的长度(Unicode 字符数)GetStringChars返回指向字符串的 Unicode 字符数组的指针。该指针在调用 ReleaseStringchars() 前一直有效ReleaseStringChars通知虚拟机平台

13、相关代码无需再访问 chars。参数 chars 是一个 指针,可通过 GetStringChars() 从 string 获得NewStringUTF利用 UTF-8 字符数组构造新 java.lang.String 对象GetStringUTFLength以字节为单位返回字符串的 UTF-8 长度GetStringUTFChars返回指向字符串的 UTF-8 字符数组的指针。该数组在被 ReleaseStringUTFChars() 释放前将一直有效ReleaseStringUTFCh ars 通知虚拟机平台相关代码无需再访问 utf。utf 参数是一个指针, 可利用 GetStringU

14、TFChars() 从 string 获得u字符串函数u数组函数函数 描述GetArrayLength 返回数组中的元素数NewObjectArray构造新的数组,它将保存类 elementClass 中的对象。所有 元素初始值均设为 initialElement GetObjectArrayElement返回 Object 数组的元素SetObjectArrayElement 设置 Object 数组的元素u异常检查函数uu异常检查函数异常检查函数n n(*env)-ExceptionCheck(env)(*env)-ExceptionCheck(env)n n用这个函数可以检查出来是否有异

15、常,没有返回零用这个函数可以检查出来是否有异常,没有返回零uu返回发生的异常返回发生的异常n n(*env)-ExceptionOccurred(env)(*env)-ExceptionOccurred(env)n n返回的对象会占用一个引用返回的对象会占用一个引用uu打印调用堆栈打印调用堆栈n(*env)-ExceptionDescribe(env)uu清空异常清空异常n(*env)-ExceptionClear(env)4.JNI 的类型和数据结构u基本类型和本地等效类型Java 类型 本地类型 说明 boolean jboolean 无符号,8 位 byte jbyte 无符号,8 位

16、char jchar 无符号,16 位 short jshort 有符号,16 位 int jint 有符号,32 位 long jlong 有符号,64 位 float jfloat 32 位 u值类型ujvalue 联合类型在参数数组中用作单元类型。u其声明方式如下: typedef union jvalue jboolean z;jbyte b; jchar c;jshort s; jint i;jlong j; jfloat f; jdouble d;jobject l; jvalue; u类型签名类型签名 Java 类型 Z boolean B byte C char S short I int J Long F float L fully-qualified-class ; 全限定的类 type type ( arg-types

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号