【vc++精品源码栏目提醒】:网学会员鉴于大家对vc++精品源码十分关注,论文会员在此为大家搜集整理了“【精品】JavaJNI编程进阶 - 其它资料”一文,供大家参考学习
Java JNI 编程进阶JNI 一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,JNI 技术的出现主要是基于三个方面的应用需求:1. 解决性能问题Java 具有平台无关性,这使人们在开发企业级应用的时候总是把它作为主要候选方案之一,但是性能方面的因素又大大削弱了它的竞争力。
为此,提高 Java的性能就显得十分重要。
Sun 公司及 Java 的支持者们为提高 Java 的运行速度已经做出了许多努力,其中大多数集中在程序设计的方法和模式选择方面。
由于算法和设计模式的优化是通用的,对 Java 有效的优化算法和设计模式,对其他编译语言也基本同样适用,因此不能从根本上改变 Java 程序与编译型语言在执行效率方面的差异。
由此,于是人们开始引入 JITJust In Time,及时编译的概念。
它的基本原理是:首先通过 Java 编译器把 Java 源代码编译成平台无关的二进制字节码。
然后在 Java 程序真正执行之前,系统通过 JIT 编译器把 Java 的字节码编译为本地化机器码。
最后,系统执行本地化机器码,节省了对字节码进行解释的时间。
这样做的优点是大大提高了 Java 程序的性能,缩短了加载程序的时间;同时,由于编译的结果并不在程序运行间保存,因此也节约了存储空间。
缺点是由于 JIT 编译器对所有的代码都想优化,因此同样也占用了很多时间。
动态优化技术是提高 Java 性能的另一个尝试。
该技术试图通过把 Java 源程序直 以充分利用 Java 动态编译和静态编译技术来提高 Java 的性能。
接编译成机器码,该方法把输入的 Java 源码或字节码转换为经过高度优化的可执行代码和动态库Windows 中的. dll 文件或 Unix 中的. so 文件。
该技术能大大提高程序的性能,但却破坏了 Java 的可移植性。
JNIJava Native Interface Java 本地化方法技术由此闪亮登场。
因为采用JNI 技术只是针对一些严重影响 Java 性能的代码段,该部分可能只占源程序的极少部分,所以几乎可以不考虑该部分代码在主流平台之间移植的工作量。
同时,也不必过分担心类型匹配问题,我们完全可以控制代码不出现这种错误。
此外,也不必担心安全控制问题,因为 Java 安全模型已扩展为允许非系统类加载和调用本地方法。
根据 Java 规范,从 JDK 1. 2 开始,FindClass 将设法找到与当前的本地方法关联的类加载器。
如果平台相关代码属于一个系统类,则无需涉及任何类加载器 否则,将调用适当的类加载器来加载和链接已命名的类。
换句话说,如果在 Java 程序中直接调用 C/C语言产生的机器码,该部分代码的安全性就由 Java 虚拟机控制。
2. 解决本机平台接口调用问题JAVA 以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。
解决 JAVA 对本地操作的一种方法就是 JNI。
JAVA 通过 JNI 调用本地方法,而本地方法是以库文件的形式存放的 在 (在 WINDOWS 平台上是 DLL 文件形式, UNIX 机器上是 SO 文件形式)。
通过调用本地的库文件的内部方法,使 JAVA 可以实现和本地机器的紧密联系,调用系统级的各接口方法。
3. 嵌入式开发应用“一次编程,到处使用”的 Java 软件概念原本就是针对网上嵌入式小设备提出的,几经周折,目前 SUN 公司已推出了 J2MEJava 2 P1atform Micro Edition针对信息家电的 Java 版本,其技术日趋成熟,开始投入使用。
SUN 公司 Java 虚拟机JVM技术的有序开放,使得 Java 软件真正实现跨平台运行,即 Java 应用小程序能够在带有 JVM 的任何硬软件系统上执行。
加上 Java 语言本身所具有的安全性、可靠性和可移植性等特点,对实现瘦身上网的信息家电等网络设备十分有利,同时对嵌入式设备特别是上网设备软件编程技术产生了很大的影响。
也正是由于 JNI 解决了本机平台接口调用问题,于是 JNI 在嵌入式开发领域也是如火如荼。
不失直观性,我们首先写一个 JNI 小例子:Java 代码 1. public class HelloJni 2. public native void displayHelloJni 3. 4. static 5. System.loadLibraryquothelloJniquot 6. 7. 8. public static void mainString args 9. //System.out.printlnSystem.getPropertyquotjava.library. pathquot 10. new HelloJni.displayHelloJni 11. 12. 在 class 文件生成的相应目录执行命令如下:----------------------------------------------------E:projectsjnitargetclassesgtjavah HelloJni----------------------------------------------------得到 C文件 HelloJni.hCpp 代码 1. / DO NOT EDIT THIS FILE - it is machine generated / 2. include ltjni.hgt 3. / Header for class HelloJni / 4. 5. ifndef _Included_HelloJni 6. define _Included_HelloJni 7. ifdef __cplusplus 8. extern quotCquot 9. endif 10. / 11. Class: HelloJni 12. Method: displayHelloJni 13. Signature: V 14. / 15. JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni 16. JNIEnv jobject 17. 18. ifdef __cplusplus 19. 20. endif 21. endif JNI 函数名称分为三部分:首先是 Java 关键字,供 Java 虚拟机识别;然后是调用者类名称全限定的类名,其中用下划线代替名称分隔符;最后是对应的方法名称,各段名称之间用下划线分割。
JNI 函数_的参数也由三部分组成:首先是 JNIEnv 是一个指向 JNI 运行环境的指针;第二个参数随本地方法是静态还是非静态而有所不同一一非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其 Java 类的引用;其余的参数对应通常 Java 方法的参数,参数类型需要根据一定规则进行映射。
编写 C文件 HelloJni.h 的实现类,我是比较常用 VC6.0 来生成 dll 文件(helloJni.dll)的.Cpp 代码 1. include ltjni.hgt 2. include quotHelloJni.hquot 3. include ltstdio.hgt 4. 5. JNIEXPORT void JNICALL 6. Java_HelloJni_displayHelloJniJNIEnv env jobject obj 7. 8. printfquotHello Dynamic Link Library has been callingnquot 9. printfquotJava_HelloJni_displayHelloJni method has been exec utednquot 10. return 11. 其实此时,我们的工程目前还暂时不能生成我们想要的 helloJni.dll 文件,问题就出在了“include ltjni.hgt”。
由于 VC6.0 里没有我们需要的“jni.h”文件,因此就需要手动加入到 VC6.0 的环境中去。
在 JAVA_HOME 路径下我们可以找到 include 文件夹,其中就可以找到我们需要的“jni.h”文件。
为了避免以后麻烦起见,将所有的 C文件全部拿出来,放在“CPP_HOMEVC98Include”路径下。
然后将工程进行打包就可以得到我们需要的“helloJni.dll”文件了。
将 helloJni.dll 文件放置于工程 classes 目录,执行命令如下:-----------------------------------------------E:projectsjnitargetclassesgtjava HelloJni-----------------------------------------------运行结果如下:-----------------------------------------------------------------Hello Dynamic Link Library has been callingJava_HelloJni_displayHelloJni method has been executed-------------------------------------------
上一篇:
【精品】C++程序书写规范
下一篇:
让情感融入语文教学中