Java本地调用C/C++的动态库

前段日子投身考博的复习,文章更新不太及时。总算告一段落,于是开始着手实现基于Java的OGC WPS规范,为了方便使用SVN存储库进行代码管理以及尝试一下Tomcat 6的新功能,IDE采用了Netbeans 6.0 M7版本。

关于WPS的Java实现,计划中的三部分工作是:1.改进已有WPS的实现,简化算法的XML配置,集成Geotools的空间分析函数,从中选择增加新的WPS操作到Algorithm库中。2.参考pyWPS的命令行调用方式,在Linux下通过Java IO包里的Runtime.getRuntime().exec()方法给GRASS命令行传入执行参数,通过命令调用的方式将GRASS的功能进行服务化提升。3.通过本地接口JNI来调用已独立封装好的GRASS API,直接将参数传入so动态库,通过GRASS的动态库来获得地理数据分析功能。目前第一和第二步的技术路子已经走通,第三步实现则较为复杂,预计可能需要做不少工作。

本地接口(Java Native Interface)是JDK的一部分,允许Java 代码使用以其它语言编写的代码和代码库。关于JNI的详细使用方法,可以找到不错的教程,在IBM DeveloperWorks上,也有关于Linux下使用本地接口的文章。JNI将Java 虚拟机嵌入本机应用程序,可以实现从Java 程序调用C/C++以及从C/C++程序调用Java代码。本机方法调用C的动态库,需要使用Javah命令重新生成引用C/C++源文件的头文件,定义JNI 的库文件和本机头文件,首先在Java类中声明要调用的本机语言方法,并载入包含本机代码的共享库,然后调用类库中的本机方法。

目前Java开发使用的IDE逐渐从EclipseNetbeans过渡,相比较来说,Netbeans近来的发展势头让人看到Java IDE新的希望,无论在功能上还是在代码感知的响应速度上都不亚于Eclipse,作为用于代码编写的环境,在不安装任何各式庞杂插件的基础上,可以带给程序员不错的体验。

转载请注明出处:工作与兴趣记录本 » Java本地调用C/C++的动态库

相关文章

评论 (9)

  1. avatar
    csm03-28 16:38

    可以考虑用GlueGen
    GlueGen is a tool which automatically generates the Java and JNI code necessary to call C libraries. It reads as input ANSI C header files and separate configuration files which provide control over many aspects of the glue code generation. GlueGen uses a complete ANSI C parser and an internal representation (IR) capable of representing all C types to represent the APIs for which it generates interfaces. It has the ability to perform significant transformations on the IR before glue code emission. GlueGen is currently powerful enough to bind even low-level APIs such as the Java Native Interface (JNI) and the AWT Native Interface (JAWT) back up to the Java programming language.

  2. avatar

    谢谢你,因为JNI使用比较繁琐,正在看有没有什么可以代替的方式
    最近在开始写毕业论文了,边写边做

  3. avatar
    Ricepig04-12 23:49

    代码感知的响应速度,NetBeans比Eclipse好太多了。不过都没法和VS和Emacs比。

  4. avatar

    代码感知响应确实很重要,最近做了一个Netbeans富客户端的例子,感觉界面表现也还不错

  5. avatar
    zhangyi02-20 20:29

    你好 我想问下关于在java里面调用grass的问题
    1 调用
    比如v.buffer 我应该写成是 exev("v.buffer input=# output=#...");
    这种方式吗? 但我自己在win下面发现 这种buffer类型的处理小程序不是可以独立运行的

    2 处理结果 在服务端接收到用户的一个featuecellction 进行缓冲 在grass处理后直接是保存在本地一个文件中 就是执行时候 output的参数,怎么转化成为xml(gml)返回给客户端呢?

  6. avatar

    1、在Linux下面需要先调用命令行启动Grass的基础运行时,并加载spearfish这样的数据集,之后再使用命令行调用类似v.buffer这样的命令执行。win下面还没有尝试过,好像Grass对Win支持不友善。但是命令行调用并不是好的办法,而且会影响效率。
    2、如果希望得到GML的返回,是不是可以考虑在服务端使用WFS的形式将结果数据发布呢
    关于GRASS服务调用,可以看一下GMU所做的工作
    http://geobrain.laits.gmu.edu/doc/grassBPEL.htm

  7. avatar
    weichunzhu12-02 20:12

    您好,我是一名大学生,看到您的博文想咨询一下是否有通过JAVA调用GRASS的WEBGIS空间分析的示例,我最近想学习一下GRASS,添加一些空间分析模块,但是只是会用GRASS进行初级的数据处理,所以想请教一下您,打扰了,十分感谢!

  8. avatar
    suan08-23 15:58

    你好,我想請問你GOOGLE MAPS API的問題
    我想做一個網站,在網站上輸入地址,即可搜尋到該地址附近的動物醫院
    程式是用asp.net寫,資料庫是用SQL server,在網路上找了很多範例,都是使用php
    我不知道該怎麼寫,書上也沒有詳細介紹,所以想說來您的blog留言問您看看,打擾了,謝謝!

    • avatar
      Gao Ang08-30 10:31

      这个示例可以搜索指定位置500m范围内,指定类型的地标,可以参考试试看 http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/examples/place-search.html