使用Java打包GDAL

时间:2015-11-12 19:47:08

标签: java gdal java-binding

我有一个在Win7上使用GDAL绑定的Java项目。问题在于,由于绑定的性质,它需要设置环境变量才能工作,特别是PATHGDAL_DATAGDAL_DRIVER_PATHPROJ_LIB。我的意思是他们很容易创建并指向GDAL目录。但是,如果我想分发这个,对普通用户来说这将是一个笨拙的步骤。

我需要某种方式来配置GDAL绑定,以便用户可以将程序复制到任何他们喜欢的地方,其中包含jar和GDAL库,并且引导代码将自动设置GDAL以找到相对于它当前的那些变量位置。

现在我尝试了以下内容(使用了一个非常相似的问题提出的部分解决方案:package GDAL JAVA Binding and native library in a SWT plugin):

// define `root` before to grab the path of the where the JAR is located
// bit of a hack-y way to set the classpath
System.setProperty("java.library.path", root+"gdal");
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
// set these gdal config variables programatically
gdal.SetConfigOption("GDAL", root + "gdal");
gdal.SetConfigOption("GDAL_DATA", root + "gdal\\gdal_data");
gdal.SetConfigOption("GDAL_DRIVER_PATH", root + "gdal\\gdalplugins");
gdal.SetConfigOption("PROJ_LIB", root + "gdal\\proj_lib");

但它在第一个SetConfigOption()失败并出现以下错误:

Native library load failed.
java.lang.UnsatisfiedLinkError: C:\...\gdal\gdaljni.dll: Can't find dependent libraries

这意味着至少第一部分正在工作,因为它正确定位gdaljni.dll,但似乎在SetConfigOption()可以做到这一点之前,它已经尝试调查这些路径只是为了初始化和失败

现在,如果我手动设置环境变量,显然它运行正常。

GDAL绑定来自:http://www.gisinternals.com/

1 个答案:

答案 0 :(得分:2)

我为没有提供特定于Windows的答案而道歉,但是类Unix和Windows系统之间的概念基本相同。您遇到的错误是由于库路径(在Windows中,仍然是二进制dll)不是所需路径的一部分。 GDAL配置设置不管理到DLL的路由,而是管理内部数据的位置。

这可能不是最佳解决方案,但过去这对我来说非常有效。关键是要创建一个脚本来更新启动应用程序所需的路径。

在脚本中,您需要...

  1. 获取脚本本身的目录,以便您可以从系统的任何位置启动应用程序。
  2. 在适当的环境变量中添加库的路径。使用SCRIPT_PATH作为路径的基础。
  3. 更新DYLD_LIBRARY_PATH(Mac),LD_LIBRARY_PATH(Linux),如果我还记得,PATH(Windows)。
  4. 启动应用程序,就像使用SCRIPT_PATH变量作为基础导出库路径一样。
  5. 这是一个我没有在Mac上的clang中设置rpath的示例。

      • 仓/富
      • LIB / libtest.dylib
      • run.sh

    运行脚本

    #!/bin/sh
    
    #  Get the directory of this script being run
    SCRIPT_PATH="`dirname ${BASH_SOURCE[0]}`"
    
    # Export the Path
    export DYLD_LIBRARY_PATH=$SCRIPT_PATH/lib:$DYLD_LIBRARY_PATH
    
    #  Run the executable
    $SCRIPT_PATH/bin/foo