top
Loading...
用Jace整合Java和C++

摘要

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類型系統

圖2表示基本的Jace數據類型的類圖表。這些類是我們訪問Jace運行時間庫的簡單的接口,它與JNI的數據類型對應非常緊密。


(圖:picture02)

Jace的數據類型系統是直接以24種JNI數據類型為基礎的,對于每一種JNI數據類型而言,Jace都有一個相應的C++代理類。9種JNI簡單數據類型以及jvalue、jclass、jobject、jstring和jthrowable都直接映射為相應的Jace代理類,JNI的jarray數據類型以及9個派生的數組數據類型都被映射為一種基于模板的JArray數據類型。在下面的部分中,我們將對每種C++代理類進行詳細的解釋。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗