IDL学习记录和Java调用IDL方法
02月06日 08:32:02回首1949阅读数:385更多
个人分类:随想
版权声明:乐呵乐呵得了 /u010214568/article/details/79033685
先记录一下最近的IDL学习经历。
IDL指的是ENVI、IDL的那个IDL,和我老婆吹牛,说是处理火星数据用的,事实可能就是如此。
从1月7日开始,迫于项目的压力,需要在10号前学会IDL,并且把两个博士写的遥感数据处理IDL代码集成到项目中,压力还是很大的。
大学的时候就有了解过IDL,只是一直没有机会去耐心的学。这下也了却了自己多年的心愿,并用4天的时间完成任务。
IDL的资料比较少,很多人在学习IDL的路上走过不少弯路,把我的经历记录下来,一来是自我学习的记录,二来能够帮助希望入门IDL的朋友。
再说说IDL学习的一些方法和个人快速上手经验
个人比较喜欢看书,纸质书,山东省图书馆借的,学习的主要资料也是这本书:《遥感二次开发语言IDL》徐永明编著。用了一上午和一下午的时间把第一、二、三、四、六、八章看了一遍,重点是第一、二、三、四章,用IDL编译器自己动手把书上的例子用命令行敲一遍。第六、八章一页一页翻一遍,其他章节大致翻看一下。依照这个顺序,肯定就能写点简单的IDL代码了。
对于学习编程语言,我发现了一种比较好的方法来实现:边看书边照着例子敲的“境界”,就是看纸质书的同时,下载一本电子书。看理论知识的时候看纸质书,学习例子的时候看电子书,学习例子的时候翻书是个比较累人和不方便的事。
《遥感二次开发语言IDL》这本书中缺少一个内容,就是IDL对象,这个内容可以在Esri的的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类的构造函数,要在类定义前,这个方法必须有
;必须有返回值,1成功,0失败
;此处可以做一些初始化操作,比如初始化envi批处理模式、其他参数等
FUNCTION helloworldex::INIT
RETURN, 1
END
;IDL类定义,类名为helloworldex,后面跟两个下划线和一个define
;类的里面是一个结构体,就是这样的写法,helloworldex作为结构体署名
;who和message是结构体的两个成员
;$是续行符,相当于写在一行上
;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类中有多个方法,可以只导出需要暴露的方法即可,不需要全部导出
配置导出方法的参数
工具栏第三个按钮,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中创建java项目
引用外部jar包,jar包存放在IDL安装目录下,此jar包的位置不能移动,移动后IDL代理类无法找到idl的程序,我的是C:\Program Files (x86)\ITT\IDL\IDL80\resource\bridges\export\java\javaidlb.jar
把生成的包和.java复制到java项目中
继承这个类,实现此IDL jar包中提供的JIDLOutputListener接口,我创建了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.创建对象
hello1.addIDLOutputListener(this);//3.添加监听,不添加java控制台不会打印IDL print的内容
String strFromIDL = hello1.helloFrom(new JIDLString("我家宝宝")).stringValue();//调用
System.out.println("-------->来自IDL的问候:"+strFromIDL);
hello1.destroyObject();//JVM虚拟机不负责回收IDL代理对象的垃圾,需要我们自己回收
}
@Override
/**
* 实现此接口,可以将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不能移动位置,发布tomcat后,会出现该jar包中的类找不到的情况,解决办法是在配置tomcat的类共享类加载器。
在tomcat的catalina.properties配置文件中,将shared.loader项配置为javaidlb.jar的绝对路径
就此结束,希望能帮助到需要的人。