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

  1. ;类的方法和过程定义:functon/pro 类名::方法名/过程名

  2. FUNCTION helloworldex::HelloFrom, who

  3.   IF (N_ELEMENTS(who) NE 0) THEN BEGIN

  4.     message = "Hello World from " + who

  5.     RETURN, message

  6.   ENDIF ELSE BEGIN

  7.     message = 'Hello World'

  8.     RETURN, message

  9.   ENDELSE

  10. END

  11. ;类的方法和过程定义:functon/pro 类名::方法名/过程名

  12. ;Init方法相当于IDL类的构造函数,要在类定义前,这个方法必须有

  13. ;必须有返回值,1成功,0失败

  14. ;此处可以做一些初始化操作,比如初始化envi批处理模式、其他参数等

  15. FUNCTION helloworldex::INIT

  16.   RETURN, 1

  17. END

  18. ;IDL类定义,类名为helloworldex,后面跟两个下划线和一个define

  19. ;类的里面是一个结构体,就是这样的写法,helloworldex作为结构体署名

  20. ;who和message是结构体的两个成员

  21. ;$是续行符,相当于写在一行上

  22. ;IDL类默认有一个self表示本对象,相当于java中的this

  23. ;self.who可以引用who成员

  24. ;var = self.HelloFrom, 'Java'可以引用HelloFrom方法,

  25. ;也可以定义过程,使用方法和function类似

  26. PRO helloworldex__define

  27.   struct = {helloworldex, $

  28.     who: '' , $

  29.     message: ' ' $

  30.     }

  31. END

2.测试

可以在IDL命令行编写IDL代码测试这个对象,当然要先编译一下

  1. IDL> obj = obj_new('helloworldex')

  2. IDL> print,obj.HelloFrom()

  3. Hello World

  4. IDL> print,obj.HelloFrom('我说:')

  5. Hello World from 我说:

  6. 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类,有几个注意的地方看注释,比较简单

  1. package hello;

  2. import com.idl.javaidl.JIDLObjectI;

  3. import com.idl.javaidl.JIDLOutputListener;

  4. import com.idl.javaidl.JIDLString;

  5. public class HelloWorld1Ex1 extends HelloWorld1 implements JIDLOutputListener {

  6. private static final long serialVersionUID = 1L;

  7. private HelloWorld1 hello1;

  8. public HelloWorld1Ex1() {

  9. //固定写法

  10. hello1 = new HelloWorld1();//1.实例化助手导出的类

  11. hello1.createObject();//2.创建对象

  12. hello1.addIDLOutputListener(this);//3.添加监听,不添加java控制台不会打印IDL print的内容

  13. String strFromIDL = hello1.helloFrom(new JIDLString("我家宝宝")).stringValue();//调用

  14. System.out.println("-------->来自IDL的问候:"+strFromIDL);

  15. hello1.destroyObject();//JVM虚拟机不负责回收IDL代理对象的垃圾,需要我们自己回收

  16. }

  17. @Override

  18. /**

  19. * 实现此接口,可以将IDL中的print输出到java控制台

  20. */

  21. public void IDLoutput(JIDLObjectI arg0, String arg1) {

  22. System.out.println("IDL:>>"+arg1);

  23. }

  24. public static void main(String[] args) {

  25. HelloWorld1Ex1 ex1 = new HelloWorld1Ex1();

  26. }

  27. }

结果:

-------->来自IDL的问候:Hello World from 我家宝宝

5.如果是Web项目,因为此处IDL的jar包javaidlb.jar不能移动位置,发布tomcat后,会出现该jar包中的类找不到的情况,解决办法是在配置tomcat的类共享类加载器。

在tomcat的catalina.properties配置文件中,将shared.loader项配置为javaidlb.jar的绝对路径

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

IDL学习记录和Java调用IDL方法相关推荐

  1. Java 调用 Python 方法学习笔记

    文章转载自: 作者:IT_xiao_bai                         来源:CSDN                         原文:https://blog.csdn.n ...

  2. java基础案例教程前4章知识点_java学习记录4 Java基础知识点

    java学习记录4 Java基础知识点 1. 注释 单行注释 使用"//"开头,后面是注释的内容 一般在要注释的语句的上面加注释 多行注释 以"/*"开头,以& ...

  3. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)

    基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...

  4. java 调用祖父方法_在Java中调用祖父母方法:您不能

    java 调用祖父方法 在文章保护的重点中,我详细介绍了"受保护"如何扩展"包私有"访问. 我在那儿写道: 你能做的是 覆盖子类中的方法或 使用关键字super ...

  5. gradle exclude_Gradle学习记录020 java工程的测试 part1

    详细学习如何用Gradle测试java工程.第二部分.该学习记录基于Gradle官方网站资料.本篇参考链接如下: https://docs.gradle.org/current/userguide/j ...

  6. java调用一个方法后怎么继续执行不等待该方法的返回_Java面试题大全2020版(二)...

    今天给大家推送第二部分,主要的大块内容分为:多线程.反射.对象拷贝.三大块内容中涉及到的考点如下: 三.多线程 35. 并行和并发有什么区别? 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或 ...

  7. 运筹优化学习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 ...

  8. Java学习记录:Java飞机大战进阶版(敌人有子弹、有生命、有boss、有声音、还有大招一键清屏)

    Java飞机大战 序言 一.项目需求分析 二.各个对象类的设计 加载图片类Images 抽象类FlyingObject 天空类Sky 小敌机类Airplane 大敌机类BigAirplane 侦察机类 ...

  9. Java调用tostring方法分析_Java对象toString()方法

    对象的字符串表示以可读格式包含有关对象状态的信息. Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...

最新文章

  1. Python源码学习:多线程实现机制
  2. 如何进行机器学习框架选择
  3. ArcGIS Engine中的Symbols详解
  4. 狼的故事16:空有强壮的身体
  5. CRM order lock will trigger product read API
  6. python字符串split_python字符串之split
  7. 前端学习(1872)vue之电商管理系统电商系统之完善登录之后的操作
  8. Element UI 总结
  9. Base64序列化和反序列化
  10. WinRAR_5.40 绿色!!!无广告
  11. R语言绘图(一)热图
  12. MT【30】椭圆的第二定义解题
  13. 《数学建模》知识点总结
  14. Sony 入股 Epic,新世代游戏巨头分道扬镳的开始
  15. 2014黑帽大会揭露十大恐怖安全漏洞!
  16. Vue.js基础(极简、自用)
  17. NotePad++7.5 64 bit版本以后没有plugin manger的解决方法
  18. python产生随机整数数组_生成随机整数数组
  19. 如何用3D技术“复现”遗址?
  20. 聊一聊Go中的GMP调度模型

热门文章

  1. 2022年全球市场超宽带电容器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  2. python中l2 什么意思_L1和L2正则知多少?
  3. 前端三件套(一):HTML
  4. CakePHP 中文教程3
  5. ASP.NET MVC | 简介
  6. 自用的快速复习Java基础知识,不适用于每一个人
  7. 200瓦PFC方案 200瓦pfc控制器方案,采用ucc28019a全套图纸
  8. Spark日志分析项目Demo(8)--SparkStream,广告点击流量实时统计
  9. 云服务器加固系统,服务器加固系统
  10. IP对讲服务器源码,IP对讲话机开发包含软硬件