第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > IDL学习记录和Java调用IDL方法

IDL学习记录和Java调用IDL方法

时间:2022-09-05 03:39:17

相关推荐

IDL学习记录和Java调用IDL方法

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的绝对路径

就此结束,希望能帮助到需要的人。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。