原野,尚福華,曹茂俊
(東北石油大學,黑龍江 大慶163318)
新一代測井軟件 CIFLog[1]是基于Java-Net-Beans計算機技術(shù)開發(fā)的第三代測井處理解釋系統(tǒng),是國際上首個可以同時在 Windows、Linux和Unix等3大操作系統(tǒng)下高效運行的大型測井軟件平臺。平臺采用開放的Java語言,完全模塊化設計思想,充分實現(xiàn)了勘探與生產(chǎn)解釋一體化、網(wǎng)絡與本地訪問一體化[2]、單井與多井處理一體化以及真正意義上的跨操作系統(tǒng)運行能力。
為保證一體化平臺的順利推廣,需要兼顧目前已形成的測井解釋工作習慣,并把已有的一些優(yōu)秀測井解釋方法集成進平臺中[3],使一體化平臺[4-6]最大限度地實現(xiàn)知識復用。早期的測井軟件和測井方法,如國內(nèi)的 CifSun、Forward[7]和 Lead[8],國外斯倫貝謝公司的GeoFrame[9]、阿特拉斯公司的eX-press[10]、哈里伯頓公司的Petrosite PRO等都是采用Fortran、C/C++語言編寫。把已有的一些測井解釋方法添加到CIFLog平臺中,用Java語言重新編寫工作量大,而且隨著項目的推廣,會有越來越多的測井軟件需要移植到一體化平臺中來,所以為提高開發(fā)效率,同時保證測井軟件方便、穩(wěn)定地集成到平臺中,一體化平臺需要建立多語言測井應用程序集成機制。
Java語言在訪問其他編程語言時先后提供了Java Native Interface(JNI)技術(shù)和Java Native Access(JNA)技術(shù)2種方式。夏守姬[11]和劉英明[12]詳細討論了JNI技術(shù)在CIFLog平臺應用軟件集成中的應用。JNI技術(shù)使Java語言和其他語言可進行雙向調(diào)用,即通過JNI技術(shù)Java程序可以調(diào)用其他語言程序,并且其他語言程序也可以調(diào)用Java程序,因此一體化平臺中的雙向調(diào)用通常采用JNI技術(shù),但是JNI技術(shù)在可移植性、錯誤檢查、內(nèi)存管理等方面存在著不足。而JNA技術(shù)是一個開源的Java框架,是建立在JNI基礎之上的Java平臺類庫,克服了JNI在可移植性、錯誤檢查、內(nèi)存管理方面存在的諸多不足。所以,文本主要討論利用JNA技術(shù)對多語言測井應用程序集成方式的改進與發(fā)展。當一個測井軟件平臺同時提供JNI和JNA這2種應用程序集成方式時,可以最大限度地滿足用戶的各類不同需求。
JNA技術(shù)是建立在JNI基礎之上的Java平臺類庫,解決了JNI技術(shù)存在的諸多不足。對于測井應用集成,特別研究了JNA和JNI技術(shù)的6點差異,并在一體化測井軟件平臺底層開發(fā)中充分加以擴展應用。
(1)在JNI使用中的微小錯誤會使Java虛擬機(Java Virtual Machine,JVM)崩潰,并且沒有任何錯誤信息,很難進行調(diào)試;而JNA只針對調(diào)用函數(shù)實現(xiàn)相應的Java接口,不需要Java開發(fā)人員脫離Java運行環(huán)境,出現(xiàn)錯誤容易定位,并可以快速解決錯誤,并且JNA支持虛擬機崩潰保護機制(VM Crash Protection)[13]。
(2)依賴JNI的應用程序失去了Java提供的平臺可移植性,JNI需要針對不同的操作系統(tǒng)編寫不同的JNI適配器[14]實現(xiàn)(適配器代碼是使用C語言對本地代碼進行二次包裝,實現(xiàn)Java語言和本地代碼的調(diào)用),并且需要在應用程序運行時正確地加載,而JNA會自動生成代理對象,不需要編寫適配器代碼,只需要重新編譯本地代碼,就可以在不同操作系統(tǒng)中運行,目前JNA可以在 Mac OS X,Microsoft Windows,Solaris和Linux等系統(tǒng)下運行[15]。
(3)JNI框架沒有為本地執(zhí)行代碼分配的非Java虛擬機(non-JVM)內(nèi)存資源提供動態(tài)的垃圾回收機制[16],因此本地代碼必須顯示地釋放所有它所申請的內(nèi)存資源,而JNA為本地函數(shù)指針自動生成Java代理類,代理模式隱藏了本地代碼集成的復雜性,并且所有申請的內(nèi)存都由JNA統(tǒng)一管理。
(4)JNI技術(shù)不支持Java語言所提供的新特性,如新輸入輸出(New I/O,NIO)等,但是JNA對這些新特性都提供了很好的支持。
(5)Java和C/C++中數(shù)據(jù)類型長度可能不一致,譬如char型在C/C++里是8bit,而在Java里是16bit,以及C/C++有指針而Java里沒指針,使用JNI技術(shù)需要用C語言編寫適配器在C語言中映射Java的數(shù)據(jù)類型。但是JNA技術(shù)提供了一個動態(tài)的C語言編寫的轉(zhuǎn)發(fā)器,可以自動實現(xiàn)Java和C之間的數(shù)據(jù)類型映射。數(shù)據(jù)類型自動映射[17]關(guān)系見表1。
表1 數(shù)據(jù)類型匹配表
(6)JNI技術(shù)調(diào)用其他語言時,首先需要使用C語言編寫適配器,使用JNI規(guī)定的數(shù)據(jù)結(jié)構(gòu)映射C語言的數(shù)據(jù)結(jié)構(gòu),再調(diào)用已有的集成程序中公布的函數(shù),然后在Java中載入適配器,再編寫Java native函數(shù)作為集成程序中函數(shù)的代理,經(jīng)過上述繁瑣的步驟后才能在Java中調(diào)用集成程序中的函數(shù)。而JNA不需要編寫適配器,只需要在Java中編寫接口類作為代理就可以在Java程序中調(diào)用集成程序中公布的函數(shù)。所以JNA技術(shù)使Java程序更容易訪問集成程序中的函數(shù),使用JNA技術(shù)可以更高效、快速、穩(wěn)定地開發(fā)大型軟件平臺。
(1)根據(jù)測井集成程序中地導出函數(shù)在Java中編寫對應接口類,每個導出函數(shù)對應1個接口,沒有調(diào)用的函數(shù)不需要聲明Java接口,并在接口類中定義invoke函數(shù),函數(shù)的參數(shù)類型要與數(shù)據(jù)類型匹配表相一致。
(2)使用JNA類庫的Native類的loadLibrary工廠方法創(chuàng)建集成程序的代理對象,使用代理模式隱藏本地代碼集成的復雜性[18]。
(3)JNA通過代理對象可以調(diào)用集成程序中發(fā)布的函數(shù),即使用集成程序中的方法處理對平臺底層數(shù)據(jù)進行處理,處理結(jié)束后把結(jié)果作為參數(shù)返回或者直接寫回到平臺數(shù)據(jù)底層,從而實現(xiàn)一體化平臺調(diào)用集成程序。
(1)在集成程序中聲明需要調(diào)用Java函數(shù)的函數(shù)指針,即在集成程序中定義接口類。
(2)針對集成程序的函數(shù)指針,在Java中定義接口,并添加invoke方法,方法參數(shù)與函數(shù)指針中聲明的參數(shù)相對應,并添加該接口的實現(xiàn)類。
(3)在平臺中創(chuàng)建接口實現(xiàn)類的實例對象,并作為參數(shù)傳遞給集成程序,在集成程序中通過從Java中傳遞的參數(shù)調(diào)用Java函數(shù),從而通過JNA回調(diào)機制實現(xiàn)集成程序調(diào)用平臺中的Java函數(shù)。
平臺通過數(shù)據(jù)訪問接口訪問底層數(shù)據(jù),實現(xiàn)多語言測井應用程序與一體化平臺之間的數(shù)據(jù)通信,數(shù)據(jù)底層格式是基于廣義測井曲線理論[19],在充分吸取Cif[20]數(shù)據(jù)格式優(yōu)點的基礎上進行發(fā)展和完善形成了升級版Cifplus格式。平臺通過數(shù)據(jù)訪問接口訪問Cifplus數(shù)據(jù)底層,平臺數(shù)據(jù)底層提供了數(shù)據(jù)緩存機制,大大提高了集成程序讀?。瘜懭肫脚_底層數(shù)據(jù)的速度,所以平臺使用JNA把底層讀取的數(shù)據(jù)作為參數(shù)傳遞給集成程序進行計算處理,處理完成后,返回參數(shù)或者把數(shù)據(jù)結(jié)果傳回一體化平臺,通過平臺提供的數(shù)據(jù)訪問接口和緩存機制把數(shù)據(jù)回寫入數(shù)據(jù)底層。
根據(jù)集成程序中公布的函數(shù)在一體化平臺中定義統(tǒng)一的接口,集成程序的每個測井方法對應1個Java接口,CIFLog平臺只針對接口進行調(diào)用,而不依賴于集成程序的具體實現(xiàn)。保證遵循該標準編寫的集成程序均能加載到一體化測井平臺中,當增加新的集成程序或者集成程序中測井算法更新后,只需要重新編譯集成程序,不需要修改CIFLog平臺接口。所有集成程序統(tǒng)一放到CIFLog平臺的資源目錄下,CIFLog平臺調(diào)用集成程序中測井方法時JNA管理層會把要使用的集成程序按組動態(tài)加載進平臺中。JNA管理層把數(shù)據(jù)底層中測井數(shù)據(jù)傳遞給集成程序中測井方法進行處理,處理結(jié)束后把處理結(jié)果返回到數(shù)據(jù)底層,同時發(fā)送消息給繪圖對繪圖對象進行刷新。
如圖1所示,每個集成程序都對應1個組,組表示集成程序的分類,是同類集成程序的集合。JNA管理層框架通過Java接口創(chuàng)建集成程序的代理對象,把集成程序加載進平臺中,代理對象隱藏了代碼集成的復雜性,平臺中的其他模塊可以通過JNA管理層中Java接口的代理對象直接調(diào)用集成程序中的相應函數(shù)。
圖1 JNA集成框架
為方便集成各種處理方法,一體化平臺支持Fortran、C\C++、C#等語言。以中國石油集團長城鉆探工程有限公司的人工交互時差提取模塊集成到一體化平臺為例。CIFLog集成后的時差提取PAAT-A DATA EDITOR模塊可共享平臺數(shù)據(jù)底層和繪圖,其中曲線DTCT1R,DTCT2R,DTST1R,DTST2R可被編輯,稱為主曲線。主曲線分別又對應了1條副本曲線,兩者的曲線值完全相同。在編輯曲線狀態(tài),選中某1條主曲線的曲線頭之后,該曲線變成紅色,所有的編輯工作都在主曲線所對應的副本曲線上進行。在編輯過程中,用戶根據(jù)STC二維曲線和其他曲線的走向(例如GR、SP等),在副本曲線附近、幔度值最可能的位置點擊鼠標左鍵,設置曲線新的走向。然后點擊右鍵調(diào)用集成程序中測井方法,JNA管理層會把對應深度段的曲線數(shù)據(jù)作為參數(shù)傳入集成程序中。處理方法會在這些設置點附近若干點內(nèi)重新搜索一個波列相關(guān)性最好的幅度值,并把處理結(jié)果返回到平臺,使處理后的深度段數(shù)據(jù)替換掉原有的副本曲線。同時刷新繪圖,井眼補償后的曲線在該深度段的走勢也會發(fā)生變化,實現(xiàn)了JNA調(diào)用集成程序中處理方法,并與平臺的數(shù)據(jù)底層、繪圖的交互。
目前,平臺已完成PAAT-A DATA EDITOR模塊的開發(fā),實現(xiàn)了原有人工交互時差提取處理解釋的功能。利用平臺集成后的PAAT-A DATA EDITOR模塊對多口井進行了處理解釋,已基本實現(xiàn)了與原有應用程序處理結(jié)果相同的效果,并在一些功能上對原有處理解釋程序進行了擴充。圖2為平臺PAAT-A DATA EDITOR模塊的圖形界面。
(1)利用JNA技術(shù)對多語言測井應用程序集成解決了JNI技術(shù)在可移植性、錯誤檢查、內(nèi)存管理等方面存在的不足,JNA技術(shù)在一體化平臺應用大大減少了開發(fā)工作量,提高了平臺的健壯性和可移植性。
(2)JNA是對JNI的進一步封裝,JNI在調(diào)用效率上比JNA高,而且JNI技術(shù)支持Java語言與其他編程語言之間的雙向調(diào)用,而JNA只支持Java語言調(diào)用其他編程語言程序,所以一體化平臺中對于JNI的集成方式也是必不可少的。
[1] 中國石油第三代測井軟件CIFLog成功發(fā)布[J].石油學報,2011,32(3):494.
[2] 趙亦朋,王才志,黃亭宇.基于SOA的測井解釋平臺中間層設計[J].石油學報,2008,29(5):782-785.
[3] 陸大衛(wèi),張世剛.測井軟件走集成化道路[J].測井技術(shù),1996,20(1):5-11.
[4] 屈科文,李增智,王立,等.一種基于Internet的業(yè)務平臺體系結(jié)構(gòu)[J].計算機應用研究,2004,21(3):181-182.
[5] 袁婷,羅謙,周明天.一種基于 UNIX環(huán)境的中間業(yè)務平臺的設計和實現(xiàn)[J].計算機應用研究,2003,20(10):122-124.
[6] 張明強,繆淮扣.中間業(yè)務平臺的設計與實現(xiàn)[J].計算機應用研究,2003,20(2):154-157.
[7] 金勇,張世剛,顧列剛,等.FORWARD測井解釋平臺中使用的先進技術(shù)[J].測井技術(shù),2000,24(1):64-70,78.
[8] Yu Chunhao,Li Changwen.Development of LEAD System and Its Application[J].Well Logging Technology,2005,29(5):396-398.
[9] 黃芳.GeoFrame數(shù)據(jù)庫管理問題分析與研究[J].石油儀器,2005,19(5):77-80.
[10] 陳建清.eXpress測井評價軟件的應用特色[J].國土資源科技管理,2004(4):77-80.
[11] 夏守姬,李寧,李偉忠,等.Java測井平臺上多語言應用集成框架設計[J].石油學報,2010,31(5):810-814.
[12] 劉英明,李寧,張玲,等.基于JNI技術(shù)C++測井應用程序集成方法[J].石油學報,2009,30(6):980-984.
[13] Java Native Access(JNA)[EB/OL].https:∥github.com/twall/jna#readme.
[14] Ernst Juhnke,Seiler.LCDL:An Extensible Framework for Wrapping Legacy Code[C]∥Kuala Lumpur,Malaysia, Association for Computing Machinery,2009:648-652.
[15] Java Native Access(JNA)[EB/OL].http:∥en.wikipedia.org/wiki/Java_Native_Access.
[16] Java Native Interface (JNI)[EB/OL].http:∥en.wikipedia.org/wiki/Java_Native_Interface.
[17] Gao Yongping,Guan Fenfen.The Interface Design of Cross-platform in Meteorological Operations[C]∥IEEE:8675-8678.
[18] Anthony Ferreira La Marca,Dias D R C.Integrating Interaction Resources in the Graphics Clusters[C]∥Seoul,Republic of Korea,IEEE Computer Society:310-313.
[19] Li Ning.A High Efficient and Low Cost Exploration Data Management System[C]∥SPE 104453,2006.
[20] 陸大衛(wèi),李寧.工作站多井處理的實現(xiàn)[J].測井技術(shù),1996,20(2):79-87.