用Jace整合Java和C++ - 编程入门网
并作为所有引用数据类型的基础类。除了最重要的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 ) {
用Jace整合Java和C++(3)时间:2010-09-13第二种方法,我们可以通过创建一个新的Java对象来构建JObject子类。可以通过调用其他子类的构建器创建新的对象,子类可以使用JNI调用合适的Java构建器。在构建Java对象后,子类就会创建一个新的指向它的全局性引用:
无论如何创建JObject子类,子类唯一的操作是对在构建时创建的全局性引用调用DeleteGlobalRef()。 ·引用类型的数据可能是空值,通过调用JObject::isNull(),我们可以检测C++代理类是否指向一个为空值的Java对象:
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++代理。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |