2

我有一个在 Win7 上使用 GDAL 绑定的 Java 项目。问题是由于绑定的性质,它需要设置环境变量才能工作,特别PATH是 、GDAL_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/

4

1 回答 1

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 变量作为基础导出库路径一样。

这是一个我没有在 Mac 上设置 rpath 的示例。

  • 包裹

    • 斌/富
    • lib/libtest.dylib
    • 运行.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
于 2015-11-16T00:01:16.270 回答