用Jace整合Java和C++ - 编程入门网
用Jace整合Java和C++时间:2010-09-13摘要 Jace是一种免费的开放源代码的工具,它使我们能够轻松地开发JNI(Java本机接口)代码。本篇文章详细地分析了JNI API的问题,以及如何使用Jace解决这些问题。 如果没有更深的了解,我们一定会以为Sun设计JNI的目的是为了不让Java编程人员使用它。毕竟,类型安全形同虚设,缺乏错误检查机制,进行一次简单的Java方法调用需要4次或更多的JNI调用,这都是JNI明显的不足之处。另外,我们还必须管理JNIEnv指针,不能在多个线程中使用JNI调用,必须为每种可能的操作在9个函数调用中进行选择,而且异常信息的获取也非常地困难。这还只是JNI所出现问题的一部分,我们还能发现许多其他问题。 这些限制中的许多部份都与JNI与C语言的绑定有关,C语言本身对类型安全、异常处理机制的支持也非常不好。尽管目前大多数的编程人员都已经能够使用C++编写代码,但Sun没有放弃C编程人员,这也是JNI目前这种状况的原因。不幸的是,这种很难使用的API给开发人员带来了许多困难。 Jace是一款免费的开放源代码的工具包,旨在使JNI编程变得更加简单。它支持由Java类文件自动生成C++代理类以及C++与Java的异常、数组、包、对象的整合,管理Java引用的线程绑定和生命周期。更为重要的是,它能够使我们开发更小、更易于理解、在编译时类型安全的模块。 JNI的类型系统 Jace最基本的特点是它使用C++代理类来表达Java类型。为了真正地理解代理类的优点,我们首先需要来看看JNI的类型系统。Sun在JNI中使用了24种C类型来表示所有可能的Java类型。JNI包含有9个简单类型: ·jboolean ·jbyte ·jchar ·jshort ·jint ·jlong ·jdouble ·jfloat ·void JNI有14种引用类型,如下图所示: (图:picture01) 另外,JNI有一个复合型的类型jvalue,它能够表达所有的简单和引用类型。 用Jace整合Java和C++(2)时间:2010-09-13Jace类型系统 图2表示基本的Jace数据类型的类图表。这些类是我们访问Jace运行时间库的简单的接口,它与JNI的数据类型对应非常紧密。 (图:picture02) Jace的数据类型系统是直接以24种JNI数据类型为基础的,对于每一种JNI数据类型而言,Jace都有一个相应的C++代理类。9种JNI简单数据类型以及jvalue、jclass、jobject、jstring和jthrowable都直接映射为相应的Jace代理类,JNI的jarray数据类型以及9个派生的数组数据类型都被映射为一种基于模板的JArray数据类型。在下面的部分中,我们将对每种C++代理类进行详细的解释。 简单类 9个简单的类可以作为9种JNI的简单数据类型的封装器。我们可以将这些类作为参数,并返回其他C++代理类的值:
我们也可以将这些类作为JArray类的模板参数:
JValue JValue是所有代理类的基础类,它能够表达Java所有的简单和引用数据类型。每个JValue有一个JClass,该JClass表示jvalue相应的jclass。我们只能提供一个JNI的jvalue数据类型构建JValue,JValue就成为了jvalue的持有者。大多数开发人员无需与JValues直接打交道。 JClass JClass表示JNI的数据类型jclass,它提供了访问其jclass和在不同的JNI调用中表示jclass的字符串(例如,java/lang/Object和Ljava/lang/Object)。Jace的框架使用JClass实例提供进行GetMethodID()、GetFieldID()和NewObjectArray()等JNI调用所必需的信息。大多数开发人员无需直接与JClass打交道。 JObject JObject类表示JNI的数据类型jobject, |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |