网站开发的技术解决方案,公司介绍网页模板,如何将自己做的网站发布到网上,网站必须要实名认证么JNI接口函数和指针Java虚拟机访问本机代码通过调用JNI的功能特性。JNI的功能都可以通过一个接口指针。一个接口指针是一个指向指针的指针。这个指针指向一个一个指针数组#xff0c;这个数组中的每一个成员指向一个函数入口。每个接口的功能是在一个预定义的内部数组的偏移量。…JNI接口函数和指针Java虚拟机访问本机代码通过调用JNI的功能特性。JNI的功能都可以通过一个接口指针。一个接口指针是一个指向指针的指针。这个指针指向一个一个指针数组这个数组中的每一个成员指向一个函数入口。每个接口的功能是在一个预定义的内部数组的偏移量。图一、JNI接口函数和指针JNI接口的组织像C虚函数列表或COM接口一样。使用接口列表的好处是JNI名字空间与本地代码分离开来。JNI接口指针只在当前线程有效。因此一个本地方法不能从一个线程通过该接口指针指向另一个线程。本地方法像参数一样接收JNI接口指针。当在同一个线程中有多个调用本地方法VM保证相同的接口指针传递到这个本地方法。然而本地方法可以被不同的Java线程调用因此可能会收到不同的JNI接口指针。加载和链接本机方法本地方法装载的是System.loadLibrary方法。在下面的例子中类的初始化方法加载一个特定平台的本地库中的本地方法f定义如下packagepkg;classCls {nativedouble f(int i, String s);static{System.loadLibrary(“pkg_Cls”);}}System.loadLibrary中的参数是一个库名它是由程序员任意选择的。该系统遵循一个标准把库名转换为本地库名的方法但这是与平台相关的。例如Solaris系统把pkg_Cls转换为libpkg_Cls.so而Win32系统则转换为pkg_Cls.dll。程序员可以使用一个单一的库来存储所有的任何类需要的本地方法只要这些类能够被同一类加载器加载。虚拟机内部会为每个类加载器维护一个加载本地库的的列表。虚拟机会检查与本地库匹配的方法名。虚拟机会首先查找短名称即没有参数的名称签名。然后再查找长名称即带参数签名的名称。程序员只有当一个本地方法与另一本机方法重载时才需要使用长名称。在下面的例子中本地方法g不必须连接使用长名称因为其另一个方法g不是一个本地方法因此也没有在本地库。classCls1 {intg(int i);nativeint g(double d);}本机方法的参数JNI接口指针是本地方法的第一个参数。在JNI接口指针的类型是JNIEnv。第二个参数不同这取决于本地方法是静态的还是非静态的。第二个参数为一个非静态本地方法时是对对象的引用。第二个参数为静态本地方法是对的Java类的引用。其余的参数对应于常规的Java方法的参数。本机方法通过返回值调用传递它的结果返回到调用例程。下面代码举例说明了使用C函数来实现f本地方法时本地方法f声明如下packagepkg;classCls {nativedouble f(int i, String s);...}Java对象引用像整数字符等等这些原始类型都在Java与本机代码之间复制。另外任意Java对象是通过引用传递。虚拟机必须跟踪所有已传递到本地代码的对象使这些对象不会被垃圾收集器释放。相反本地代码必须有一种机制来通知虚拟机什么时候不再需要使用这些对象了。此外垃圾收集器必须能够搬运对象所指的本机代码。全局和局部引用JNI把本地代码使用的相关对象分为两在范畴局部和全局引用。局部引用的有效期为一个本地方法调用的时间并自动机方法返回后获释。全球引用仍然有效直到它们被明确释放。所有的Java的JNI函数返回的对象都是局部引用。JNI允许程序员通过局部引用来创建全局引用。局部引用只有在线程中被建立时才有效并只在该线程中有效。本地代码不能在线程之间调用局部引用。访问字段和方法JNI允许本地代码访问字段和调用Java对象的方法。JNI通过符号名称和类型签名来判定方法和字段。例如要调用类cls中的方法f本地代码首先获得一个方法的ID如下jmethodIDmid env-GetMethodID(cls, “f”, “(ILjava/lang/String;)D”);本地代码便可以重复的使用methodID而在方法查找时不需要时间具体如下jdoubleresult env-CallDoubleMethod(obj, mid, 10, str);报告程序错误JNI不检查编程错误如空指针或非法参数类型传递。非法使用的参数类型包括用父类对象引用子类对象。Java异常JNI允许本地方法任意提高Java异常。本机代码也可以处理严重的Java异常。Java的未处理的异常是传送回了VM。因此程序员可以快速检查上次的JNI调用的返回值以确定是否发生了错误并调用一个函数ExceptionOccurred()以获得异常对象它包含一个错误的条件更详细的说明。异常处理在本地代码中有两种方法处理异常1、本机方法可以选择立即返回在Java代码中抛出异常启动了本地方法调用。2、本地代码能过调用ExceptionClear()来清除异常然后执行自己的异常处理代码。在异常被提升之后本地代码在其它JNI调用之前必须先清除异常。