快速业务通道

用Jace整合Java和C++ - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
并作为所有引用数据类型的基础类。除了最重要的JValue::getJavaValue()外,JObject类还提供了getJavaObject()方法。除了getJavaObject()能够解开jvalue,并将它放在jobject中外,这二个方法的功能相当。

JObject比较有趣,因为Java的引用类型有一些Java的简单数据类型所不具备的特性:

·引用类型没有自己的值,它们只是指向这些值。我们可以用二种方式构建JObject子类。第一种方式,我们可以将它构建为现有Java对象的引用。通过使用接受jobject(或包含jobject的jvalue)为参数的构建器或者使用C++的拷贝构建器,我们就可以以这种方式构建JObject子类。

在对JObject子类实例化时,子类实例将它自己提交给作为参数提供的jobject引用。(实例使用NewGlobalRef()创建jobject的全局性引用。)

using jace::java::net::URL;

JNIEXPORT void JNICALL Java_foo_Bar_someMethod( JNIEnv *env, jobject jURL ) {

/* 创建jURL的一个引用,而不是一个新的URL */ URL url( jurl );   /* 既然已经实例化了C++代理对象,我们就就可以方便地对jURL调用toString()等方法 */ std::string urlString = url.toString(); }

用Jace整合Java和C++(3)

时间:2010-09-13

第二种方法,我们可以通过创建一个新的Java对象来构建JObject子类。可以通过调用其他子类的构建器创建新的对象,子类可以使用JNI调用合适的Java构建器。在构建Java对象后,子类就会创建一个新的指向它的全局性引用:

/* 在foo.txt上创建一个新的FileOutputStream。 */ jace::java::io::FileOutputStream output( "foo.txt" );

无论如何创建JObject子类,子类唯一的操作是对在构建时创建的全局性引用调用DeleteGlobalRef()。

·引用类型的数据可能是空值,通过调用JObject::isNull(),我们可以检测C++代理类是否指向一个为空值的Java对象:

JNIEXPORT void JNICALL Java_foo_Bar_someMethod( JNIEnv *env, jstring javaString ) {   String str( javaString );   if ( str.isNull() ) { cout << "Error - The argument, javaString, must not be null." << endl; } }

Throwable和String

Throwable和String C++代理类都是由JObject派生的(与所有的引用类型的代理类一样),它们(还有其他一些类)是Jace库的核心部份,向用户提供C++和Java之间更紧密的整合能力。

Jace的功能

Jace可以提供许多功能,其中包括线程管理、异常管理、自动类型转换和其他一些功能。下面我们来讨论这些功能:

线程管理

在JNI中存在着一些线程方面的问题:

·JNIEnv指针只能在获得它们的线程上使用。

·大多数的JNI数据类型只能在它们存在的线程上使用。

·在调用JNI函数之前,C++线程必须连接到JVM上

Jace解决了这些问题。第一,Jace库中的每个函数自动地获得一个只能在当前线程上使用的JNIEnv指针。第二,Jace创建必要的JNI类型的全局性引用。例如,JClass创建其jclass成员的全局性引用,JObject创建其jobject成员的全局性引用。与只能供当前线程使用的局部性引用不同的是,全局性变量能够供所有线程使用。

最后,Jace中的每个函数能够确保在调用JNI函数之前,当前的线程能够连接到JVM上。

用Jace整合Java和C++(4)

时间:2010-09-13

异常管理

异常处理是JNI编程的一个短肋。在异常处理方面,Jace有二条方针:

1)Jace检查它执行的每个JNI函数的返回码。如果有错误发生,Jace清除JNI异常,然后发出Jace的JNIException消息。

2)如果由于方法发出异常消息,Jace发现Java方法的调用失败,Jace则检查并清除JNI异常,然后创建该异常的一个C++代理实例,并发出C++代理。

using namespace jace::java::net;   void

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号