gpt4 book ai didi

java - 用 Java 打包 GDAL

转载 作者:行者123 更新时间:2023-11-30 08:44:42 24 4
gpt4 key购买 nike

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

我需要一些方法来配置 GDAL 绑定(bind),用户可以将程序复制到任何他们喜欢的地方,其中包含 jar 和 GDAL 库,并且 Bootstrap 代码将自动设置 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 绑定(bind)来自:http://www.gisinternals.com/

最佳答案

对于没有提供特定于 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 上的 clang 中设置 rpath。

    • bin/foo
    • 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

关于java - 用 Java 打包 GDAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com