目录

背景

编译gdaljni

ant

proj & geos

gdaljni

配置eclipse环境

部署运行

java.lang.UnsatisfiedLinkError: no gdaljni in java.library.path

java.lang.UnsatisfiedLinkError: /HDFS/CC/Bin/libgdaljni.so: libproj.so.13: cannot open shared object file: No such file or directory

后记

背景

近期项目需要添加一个使用到gdal的模块,领导交给我来完成,说用Java和C++都可以。什么?C++?!我可不想去处理指针[手动捂脸],果断选择Java!其实也是为了能与现有系统更好的兼容,并且以后也更容易迁移,行了编不下去了。。。

但是奶衣污的我发现gdal并不原生支持Java语言,需要利用jni方式来间接使用。jni的具体定义和内涵我没有细查,应该是Java里面调用C/C++编译的so库API的一种方式。好读书,不求甚解,暂时不懂的可以留着以后需要时再学习,当前不影响正常使用即可。时间宝贵,阿弥陀佛。

编译gdaljni

系统环境为Linux,Java和gdal均已安装好,在此就不赘述了。额外需要的插件包括ant、proj和geos。proj和geos是gdal实现投影与地理变换需要的第三方库(大概是吧,存疑,哈哈),ant是编译gdaljni所需要的一个编译工具。

ant

ant的安装炒鸡简单,去官网下载tar.gz包,解压后export其bin目录到PATH环境变量即可,想要永久生效就把这个export语句写到~/.bashrc里面去。总而言之,就是敲ant的时候系统得知道运行那个bin文件夹下的ant二进制可执行文件,而不是告诉咱command not found...

proj & geos

也很简单,去官网下载,解压,依次执行./configure; make; make install即可,说白了就是分别编译了一个静态库.a和一个动态库.so。均默认安装到/usr/local/lib下,这个目录一般也在LD_LIBRARY_PATH中,不用另外配置,完美。

gdaljni

前戏整完了,接下来正式进入。。。我怎么感觉屏幕变黄了。这个的编译也好说,在gdal的安装目录下,找到swig目录,再进入java目录,好了开整。首先配置java.opt文件,敲入以下内容:

JAVA_HOME=/usr/jdk64/jdk1.8.0_121 #这里写你自己实际的jvm路径

JAVADOC=$(JAVA_HOME)/bin/javadoc

JAVAC=$(JAVA_HOME)/bin/javac

JAVA=$(JAVA_HOME)/bin/java

JAR=$(JAVA_HOME)/bin/jar

JAVA_INCLUDE=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux

最后make一发就打完收工了。make完后发现编译生成了gdaljni、gdalconstjni、osrjni、ogrjni、gnmjni等库,以及一个gdal.java文件。

配置eclipse环境

本人使用eclipse开发,据说现在比较流行IDEA,有机会玩一玩。这里简单来说分两步,第一步,导入上一步生成的gdal.java类文件,项目属性-> Java Build Path-> Libraries-> Add External Jars…-> 选取该文件,完事。这样一来import org.gdal.*就不会报错了。有了上层的API接口,没有下层的实现可不行,所以第二部就是让项目找得到上一步生成的那些***jni.so文件,具体操作是项目属性-> Java Build Path-> Libraries-> JRE System Library-> Native Library Location,选择包含这些***jni.so的目录即可。

部署运行

世界上本来并没有坑,走的人多了,就有了坑。 ——沃兹基硕德

运行的时候是在集群中,环境变了难免会有不少坑。

java.lang.UnsatisfiedLinkError: no gdaljni in java.library.path

这是由于那些***jni.so 文件没有被找到导致的,解决方法第一种就是将这些库放到当前执行程序的目录,呵呵治标不治本,那么第二种来了,就是java -jar 运行的时候,加上这么一项-Djava.library.path=/The/Path/To/The/SoFiles/,即java -Djava.library.path=/The/Path/To/The/SoFiles/ -jar RunableJarFile [args]

java.lang.UnsatisfiedLinkError: /HDFS/CC/Bin/libgdaljni.so: libproj.so.13: cannot open shared object file: No such file or directory

***jni.so 找到了但是人家还依赖别的库了,好人做到底送佛送到西,得让人家功德圆满才行。好了,先ldd libgdaljni.so看看都有哪些库not found, 缺啥补啥就行了。不想大量拷贝文件,就export LD_LIBRARY_PATH,把该包含的包含进来就行。

后记

至此暂时告一段落,后面还有个问题就是gdal相关的了,java的API貌似不太健全,AutoCreateWarpedVRT虽然很方便,但是不能指定输出分辨率,有点不爽。去gdal的GitHub库大概看了一下,也没找到解决方案。人家说“The GDALSuggestedWarpOutput() function is used to determine the bounds and resolution of the output virtual file which should be large enough to include all the input image”,我不想你用GDALSuggestedWarpOutput,我想自己指定啊哭。没办法,可以考虑去改它的源码(估计挺麻烦,望而却步),也可以用C++写一个小程序实现这个功能,再用java来调用。害,绕来绕去还是回到了C++,苍天饶过谁。。。

第一篇博客,耗时1.5小时,风格很皮,但我喜欢哈哈。自己表达能力欠佳,要多输出,多写,加油啊~

java gdal_Java通过jni方式调用gdal踩过的坑相关推荐

  1. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  2. 使用Java api 和 jni混合方式调用OpenCV

    from: http://blog.csdn.net/lingyun_blog/article/details/50733331 int a =b; 如果想在项目中直接使用opencv的java ap ...

  3. java调用jni接口,Java 中通过jni接口调用native code

    [    Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...

  4. java unbox_Java中Auto Box/Unbox容易踩到的“坑”,Integer

    Java中的Auto Box/Unbox对写代码带来了便利性,但也挺容易就踩进"坑"里,主要是NPE,对象比较还有内存浪费. 自动装箱.拆箱 先解释下什么是自动装箱.拆箱,基本数据 ...

  5. Java面试高频(多次面试踩过的坑)

    一.JAVA基础 基础知识 基本数据类型 int.byte.short.long.boolean.float.double.char 基本类型 位数 字节 默认值 范围 byte 8 1 0 -128 ...

  6. JNI和NKD入门系列一,纯java工程下JNI的开发流程(mac系统)

    Java JNI 的本意是Java Native Interface (Java 本地接口),它是为了方便Java 调用C和 C++等本地代码所封装的一层接口. 我们都知道,Java 的优点是跨平台, ...

  7. JNI的方式调用DLL(SO)(上)

    最近有个项目要调用原有的DLL文件,本来准备使用JNA,可是客户不同意,非要使用JNI的方式.万般无奈之下,只能重新使用JNI,现将JAVA调用动态链接库的一般方法总结如下. JNI是Java Nat ...

  8. JAVA调用GDAL实现影像格式转换,以tif to jpg为例

    前言 本文简单实现java调用GDAL实现影像格式转换. package Marcus.com;import org.gdal.gdal.Dataset; import org.gdal.gdal.D ...

  9. 安卓下调用python(并调用C库暂时失败)暂时使用JNI方式

    参考网上的安卓下调用python是有三种方法的,但是尝试也只有JNI方式才可能可行. 1.Chaquopy方案(不支持我们需要所使用的cyptes等库并且需要付费的) 2.CLE方案,该官网已经进不去 ...

最新文章

  1. Linux shell test用法
  2. VIM基础130命令
  3. C/C++ 电子书推荐
  4. 【Leetcode | easy】罗马数字转整数
  5. excel对比_质量管理误区:SPC软件与微软Excel的应用对比
  6. 网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常
  7. java集合概念_JAVA集合概念
  8. 手把手教你用java读写excel表格文件(POI,EasyExcel)
  9. ROS入门笔记(一): ROS简介
  10. [No0000FD]C# 正则表达式
  11. Element UI 总结
  12. React从入门到精通系列之(14)refs和DOM元素
  13. sublime后缀_在sublime text中如何设置某种扩展名文件的默认语法
  14. Shell学习笔记一
  15. 数据治理:数据血缘关系分析
  16. PDF文档加密签名处理
  17. java聚合支付之建行
  18. 光纤跳线接口_如何为10G SFP+光模块搭配对应的光纤跳线类型?
  19. 编写函数trans(str)实现字符串中数字转化为大写汉字。例如 “0123456789“转化为 “零壹贰叁肆伍陆柒捌玖“。
  20. apkeditor pro_APK编辑器 APK Editor Pro v1.15.0 + ApkModifier v3.6

热门文章

  1. 1.4Hadoop伪分布式安装
  2. android studio 更改背景和设置字体大小
  3. Apache2.4.1编译安装报错解决
  4. 开源评论:QQ真的会“开放”和“共享”吗?
  5. 超级终端设置-基本配置(华为)
  6. PHP中通过Web 执行C/C++应用程序
  7. vue-router向子组件传递参数
  8. Does taro support react hook?
  9. RabbitMQ详解(一)
  10. 确保帐户安全 谈MySQL数据库安全解决方案