IDL学习记录和Java调用IDL方法
IDL學習記錄和Java調用IDL方法
2018年02月06日 08:32:02?回首1949?閱讀數(shù):385更多
個人分類:?隨想
版權聲明:樂呵樂呵得了 https://blog.csdn.net/u010214568/article/details/79033685
先記錄一下最近的IDL學習經(jīng)歷。
IDL指的是ENVI、IDL的那個IDL,和我老婆吹牛,說是處理火星數(shù)據(jù)用的,事實可能就是如此。
從2018年1月7日開始,迫于項目的壓力,需要在10號前學會IDL,并且把兩個博士寫的遙感數(shù)據(jù)處理IDL代碼集成到項目中,壓力還是很大的。
大學的時候就有了解過IDL,只是一直沒有機會去耐心的學。這下也了卻了自己多年的心愿,并用4天的時間完成任務。
IDL的資料比較少,很多人在學習IDL的路上走過不少彎路,把我的經(jīng)歷記錄下來,一來是自我學習的記錄,二來能夠幫助希望入門IDL的朋友。
再說說IDL學習的一些方法和個人快速上手經(jīng)驗
個人比較喜歡看書,紙質書,山東省圖書館借的,學習的主要資料也是這本書:《遙感二次開發(fā)語言IDL》徐永明編著。用了一上午和一下午的時間把第一、二、三、四、六、八章看了一遍,重點是第一、二、三、四章,用IDL編譯器自己動手把書上的例子用命令行敲一遍。第六、八章一頁一頁翻一遍,其他章節(jié)大致翻看一下。依照這個順序,肯定就能寫點簡單的IDL代碼了。
對于學習編程語言,我發(fā)現(xiàn)了一種比較好的方法來實現(xiàn):邊看書邊照著例子敲的“境界”,就是看紙質書的同時,下載一本電子書。看理論知識的時候看紙質書,學習例子的時候看電子書,學習例子的時候翻書是個比較累人和不方便的事。
《遙感二次開發(fā)語言IDL》這本書中缺少一個內容,就是IDL對象,這個內容可以在Esri的2016年的IDL培訓教程中找到一點簡介。
下面在看看Java調用IDL的方法
可以使用idlexbr_assistant命令打開idl導出工具。
1.首先編寫idl類,只有編寫idl類這個工具才可以識別并導出com或者java,此處只說java,com類似
寫完后保存,保存名默認為helloworldex__define.pro
?
;類的方法和過程定義:functon/pro 類名::方法名/過程名
FUNCTION helloworldex::HelloFrom, who
? IF (N_ELEMENTS(who) NE 0) THEN BEGIN
? ? message = "Hello World from " + who
? ? RETURN, message
? ENDIF ELSE BEGIN
? ? message = 'Hello World'
? ? RETURN, message
? ENDELSE
END
;類的方法和過程定義:functon/pro 類名::方法名/過程名
;Init方法相當于IDL類的構造函數(shù),要在類定義前,這個方法必須有
;必須有返回值,1成功,0失敗
;此處可以做一些初始化操作,比如初始化envi批處理模式、其他參數(shù)等
FUNCTION helloworldex::INIT
? RETURN, 1
END
;IDL類定義,類名為helloworldex,后面跟兩個下劃線和一個define
;類的里面是一個結構體,就是這樣的寫法,helloworldex作為結構體署名
;who和message是結構體的兩個成員
;$是續(xù)行符,相當于寫在一行上
;IDL類默認有一個self表示本對象,相當于java中的this
;self.who可以引用who成員
;var = self.HelloFrom, 'Java'可以引用HelloFrom方法,
;也可以定義過程,使用方法和function類似
PRO helloworldex__define
? struct = {helloworldex, $
? ? who: '' , $
? ? message: ' ' $
? ? }
END
2.測試
?
可以在IDL命令行編寫IDL代碼測試這個對象,當然要先編譯一下
?
IDL> obj = obj_new('helloworldex')
IDL> print,obj.HelloFrom()
Hello World
IDL> print,obj.HelloFrom('我說:')
Hello World from 我說:
IDL>
3.導出
?
測試通過后,IDL控制臺使用idlexbr_assistant命令打開Export Bridge Assistant(通俗翻譯,導出助手),導出的java類是idl的代理類,代理類的內部還是調用了.pro的idl程序
?
idlexbr_assistant?
這個助手也是個軟件,不要小看,也是以“工程”的方式管理。
新建Java項目
選擇保存的__define.pro文件,此處說明,此助手只支持導出__define.pro形式的IDL類
保存此項目,設置導出的類和方法
配置導出類的名稱和包名
配置導出方法
如果IDL類中有多個方法,可以只導出需要暴露的方法即可,不需要全部導出
配置導出方法的參數(shù)
工具欄第三個按鈕,build,生成HelloWorld1.java和HelloWorld1.class,.class沒什么用。
下面說如何用java調用idl
4.Java調用IDL功能
把helloworldex__define.pro復制到IDL安裝目錄的lib文件夾中,我的是C:\Program Files (x86)\ITT\IDL\IDL80\lib
在eclipse中創(chuàng)建java項目
引用外部jar包,jar包存放在IDL安裝目錄下,此jar包的位置不能移動,移動后IDL代理類無法找到idl的程序,我的是C:\Program Files (x86)\ITT\IDL\IDL80\resource\bridges\export\java\javaidlb.jar
把生成的包和.java復制到java項目中
繼承這個類,實現(xiàn)此IDL jar包中提供的JIDLOutputListener接口,我創(chuàng)建了HelloWorld1Ex1類,有幾個注意的地方看注釋,比較簡單
?
package hello;
import com.idl.javaidl.JIDLObjectI;
import com.idl.javaidl.JIDLOutputListener;
import com.idl.javaidl.JIDLString;
public class HelloWorld1Ex1 extends HelloWorld1 implements JIDLOutputListener {
private static final long serialVersionUID = 1L;
private HelloWorld1 hello1;
public HelloWorld1Ex1() {
//固定寫法
hello1 = new HelloWorld1();//1.實例化助手導出的類
hello1.createObject();//2.創(chuàng)建對象
hello1.addIDLOutputListener(this);//3.添加監(jiān)聽,不添加java控制臺不會打印IDL print的內容
String strFromIDL = hello1.helloFrom(new JIDLString("我家寶寶")).stringValue();//調用
System.out.println("-------->來自IDL的問候:"+strFromIDL);
hello1.destroyObject();//JVM虛擬機不負責回收IDL代理對象的垃圾,需要我們自己回收
}
@Override
/**
* 實現(xiàn)此接口,可以將IDL中的print輸出到java控制臺
*/
public void IDLoutput(JIDLObjectI arg0, String arg1) {
System.out.println("IDL:>>"+arg1);
}
public static void main(String[] args) {
HelloWorld1Ex1 ex1 = new HelloWorld1Ex1();
}
}
結果:
?
?
-------->來自IDL的問候:Hello World from 我家寶寶5.如果是Web項目,因為此處IDL的jar包javaidlb.jar不能移動位置,發(fā)布tomcat后,會出現(xiàn)該jar包中的類找不到的情況,解決辦法是在配置tomcat的類共享類加載器。
?
在tomcat的catalina.properties配置文件中,將shared.loader項配置為javaidlb.jar的絕對路徑
就此結束,希望能幫助到需要的人。
總結
以上是生活随笔為你收集整理的IDL学习记录和Java调用IDL方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Android虹软免费人脸识别 SD
- 下一篇: oracle12c安装卡住_oracle