IDL学习记录和Java调用IDL方法
IDL学习记录和Java调用IDL方法
2018年02月06日 08:32:02 回首1949 阅读数:385更多
个人分类: 随想
版权声明:乐呵乐呵得了 https://blog.csdn.net/u010214568/article/details/79033685
先记录一下最近的IDL学习经历。
IDL指的是ENVI、IDL的那个IDL,和我老婆吹牛,说是处理火星数据用的,事实可能就是如此。
从2018年1月7日开始,迫于项目的压力,需要在10号前学会IDL,并且把两个博士写的遥感数据处理IDL代码集成到项目中,压力还是很大的。
大学的时候就有了解过IDL,只是一直没有机会去耐心的学。这下也了却了自己多年的心愿,并用4天的时间完成任务。
IDL的资料比较少,很多人在学习IDL的路上走过不少弯路,把我的经历记录下来,一来是自我学习的记录,二来能够帮助希望入门IDL的朋友。
再说说IDL学习的一些方法和个人快速上手经验
个人比较喜欢看书,纸质书,山东省图书馆借的,学习的主要资料也是这本书:《遥感二次开发语言IDL》徐永明编著。用了一上午和一下午的时间把第一、二、三、四、六、八章看了一遍,重点是第一、二、三、四章,用IDL编译器自己动手把书上的例子用命令行敲一遍。第六、八章一页一页翻一遍,其他章节大致翻看一下。依照这个顺序,肯定就能写点简单的IDL代码了。
对于学习编程语言,我发现了一种比较好的方法来实现:边看书边照着例子敲的“境界”,就是看纸质书的同时,下载一本电子书。看理论知识的时候看纸质书,学习例子的时候看电子书,学习例子的时候翻书是个比较累人和不方便的事。
《遥感二次开发语言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类的构造函数,要在类定义前,这个方法必须有
;必须有返回值,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的绝对路径
就此结束,希望能帮助到需要的人。
IDL学习记录和Java调用IDL方法相关推荐
- Java 调用 Python 方法学习笔记
文章转载自: 作者:IT_xiao_bai 来源:CSDN 原文:https://blog.csdn.n ...
- java基础案例教程前4章知识点_java学习记录4 Java基础知识点
java学习记录4 Java基础知识点 1. 注释 单行注释 使用"//"开头,后面是注释的内容 一般在要注释的语句的上面加注释 多行注释 以"/*"开头,以& ...
- 基于 Android NDK 的学习之旅-----Java 调用C(附源码)
基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...
- java 调用祖父方法_在Java中调用祖父母方法:您不能
java 调用祖父方法 在文章保护的重点中,我详细介绍了"受保护"如何扩展"包私有"访问. 我在那儿写道: 你能做的是 覆盖子类中的方法或 使用关键字super ...
- gradle exclude_Gradle学习记录020 java工程的测试 part1
详细学习如何用Gradle测试java工程.第二部分.该学习记录基于Gradle官方网站资料.本篇参考链接如下: https://docs.gradle.org/current/userguide/j ...
- java调用一个方法后怎么继续执行不等待该方法的返回_Java面试题大全2020版(二)...
今天给大家推送第二部分,主要的大块内容分为:多线程.反射.对象拷贝.三大块内容中涉及到的考点如下: 三.多线程 35. 并行和并发有什么区别? 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或 ...
- 运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解
目录 1 CSP问题与模型 1.1 问题描述 1.2 模型构建 2 列生成方法理论 2.1 引子 2.2 单纯形法到列生成 2.3 subproblem 2.3.1 对偶理论 2.3.2 影子价格 2 ...
- Java学习记录:Java飞机大战进阶版(敌人有子弹、有生命、有boss、有声音、还有大招一键清屏)
Java飞机大战 序言 一.项目需求分析 二.各个对象类的设计 加载图片类Images 抽象类FlyingObject 天空类Sky 小敌机类Airplane 大敌机类BigAirplane 侦察机类 ...
- Java调用tostring方法分析_Java对象toString()方法
对象的字符串表示以可读格式包含有关对象状态的信息. Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...
最新文章
- Python源码学习:多线程实现机制
- 如何进行机器学习框架选择
- ArcGIS Engine中的Symbols详解
- 狼的故事16:空有强壮的身体
- CRM order lock will trigger product read API
- python字符串split_python字符串之split
- 前端学习(1872)vue之电商管理系统电商系统之完善登录之后的操作
- Element UI 总结
- Base64序列化和反序列化
- WinRAR_5.40 绿色!!!无广告
- R语言绘图(一)热图
- MT【30】椭圆的第二定义解题
- 《数学建模》知识点总结
- Sony 入股 Epic,新世代游戏巨头分道扬镳的开始
- 2014黑帽大会揭露十大恐怖安全漏洞!
- Vue.js基础(极简、自用)
- NotePad++7.5 64 bit版本以后没有plugin manger的解决方法
- python产生随机整数数组_生成随机整数数组
- 如何用3D技术“复现”遗址?
- 聊一聊Go中的GMP调度模型
热门文章
- 2022年全球市场超宽带电容器总体规模、主要生产商、主要地区、产品和应用细分研究报告
- python中l2 什么意思_L1和L2正则知多少?
- 前端三件套(一):HTML
- CakePHP 中文教程3
- ASP.NET MVC | 简介
- 自用的快速复习Java基础知识,不适用于每一个人
- 200瓦PFC方案 200瓦pfc控制器方案,采用ucc28019a全套图纸
- Spark日志分析项目Demo(8)--SparkStream,广告点击流量实时统计
- 云服务器加固系统,服务器加固系统
- IP对讲服务器源码,IP对讲话机开发包含软硬件