附录A 使用非JAVA代码

附录A 使用非JAVA代码

ID:32974725

大小:318.54 KB

页数:21页

时间:2019-02-18

附录A 使用非JAVA代码_第1页
附录A 使用非JAVA代码_第2页
附录A 使用非JAVA代码_第3页
附录A 使用非JAVA代码_第4页
附录A 使用非JAVA代码_第5页
资源描述:

《附录A 使用非JAVA代码》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、附录A使用非JAVA代码JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余。但在某些情况下,还是必须使用非JAVA编码。例如,我们有时要访问操作系统的专用特性,与特殊的硬件设备打交道,重复使用现有的非Java接口,或者要使用“对时间敏感”的代码段,等等。与非Java代码的沟通要求获得编译器和“虚拟机”的专门支持,并需附加的工具将Java代码映射成非Java代码(也有一个简单方法:在第15章的“一个Web应用”小节中,有个例子解释了如何利用标准输入输出同非Java代码连接)。目前,不

2、同的开发商为我们提供了不同的方案:Java1.1有“Java固有接口”(JavaNativeInterface,JNI),网景提出了自己的“Java运行期接口”(JavaRuntimeInterface)计划,而微软提供了J/Direct、“本源接口”(RawNativeInterface,RNI)以及Java/COM集成方案。各开发商在这个问题上所持的不同态度对程序员是非常不利的。若Java应用必须调用固有方法,则程序员或许要实现固有方法的不同版本——具体由应用程序运行的平台决定。程序员也许实际需要不同

3、版本的Java代码,以及不同的Java虚拟机。另一个方案是CORBA(通用对象请求代理结构),这是由OMG(对象管理组,一家非赢利性的公司协会)开发的一种集成技术。CORBA并非任何语言的一部分,只是实现通用通信总线及服务的一种规范。利用它可在由不同语言实现的对象之间实现“相互操作”的能力。这种通信总线的名字叫作ORB(对象请求代理),是由其他开发商实现的一种产品,但并不属于Java语言规范的一部分。本附录将对JNI,J/DIRECT,RNI,JAVA/COM集成和CORBA进行概述。但不会作更深层次的探

4、讨,甚至有时还假定读者已对相关的概念和技术有了一定程度的认识。但到最后,大家应该能够自行比较不同的方法,并根据自己要解决的问题挑选出最恰当的一种。A.1Java固有接口JNI是一种包容极广的编程接口,允许我们从Java应用程序里调用固有方法。它是在Java1.1里新增的,维持着与Java1.0的相应特性——“固有方法接口”(NMI)——某种程度的兼容。NMI设计上一些特点使其未获所有虚拟机的支持。考虑到这个原因,Java语言将来的版本可能不再提供对NMI的支持,这儿也不准备讨论它。目前,JNI只能与用C或

5、C++写成的固有方法打交道。利用JNI,我们的固有方法可以:■创建、检查及更新Java对象(包括数组和字串)■调用Java方法■俘获和丢弃“异常”■装载类并获取类信息■进行运行期类型检查所以,原来在Java中能对类及对象做的几乎所有事情在固有方法中同样可以做到。A.1.1调用固有方法我们先从一个简单的例子开始:一个Java程序调用固有方法,后者再调用Win32的API函数MessageBox(),显示出一个图形化的文本框。这个例子稍后也会与J/Direct一志使用。若您的平台不是Win32,只需将包含了下

6、述内容的C头:#include替换成:#include并将对MessageBox()的调用换成调用printf()即可。第一步是写出对固有方法及它的自变量进行声明的Java代码:999页程序在固有方法声明的后面,跟随有一个static代码块,它会调用System.loadLibrary()(可在任何时候调用它,但这样做更恰当)System.loadLibrary()将一个DLL载入内存,并建立同它的链接。DLL必须位于您的系统路径,或者在包含了Java类文件的目录中

7、。根据具体的平台,JVM会自动添加适当的文件扩展名。1.C头文件生成器:javah现在编译您的Java源文件,并对编译出来的.class文件运行javah。javah是在1.0版里提供的,但由于我们要使用Java1.1JNI,所以必须指定-jni参数:javah-jniShowMsgBoxjavah会读入类文件,并为每个固有方法声明在C或C++头文件里生成一个函数原型。下面是输出结果——ShowMsgBox.h源文件(为符合本书的要求,稍微进行了一下修改):1000页程序从“#ifdef_cplusplu

8、s”这个预处理引导命令可以看出,该文件既可由C编译器编译,亦可由C++编译器编译。第一个#include命令包括jni.h——一个头文件,作用之一是定义在文件其余部分用到的类型;JNIEXPORT和JNICALL是一些宏,它们进行了适当的扩充,以便与那些不同平台专用的引导命令配合;JNIEnv,jobject以及jstring则是JNI数据类型定义。2.名称管理和函数签名JNI统一了固有方法的命名规则;这一点是非常重要的,因为

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。