我有一个在Win7上使用GDAL绑定的Java项目。问题在于,由于绑定的性质,它需要设置环境变量才能工作,特别是PATH
,GDAL_DATA
,GDAL_DRIVER_PATH
和PROJ_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/
答案 0 :(得分:2)
我为没有提供特定于Windows的答案而道歉,但是类Unix和Windows系统之间的概念基本相同。您遇到的错误是由于库路径(在Windows中,仍然是二进制dll)不是所需路径的一部分。 GDAL配置设置不管理到DLL的路由,而是管理内部数据的位置。
这可能不是最佳解决方案,但过去这对我来说非常有效。关键是要创建一个脚本来更新启动应用程序所需的路径。
在脚本中,您需要...
SCRIPT_PATH
作为路径的基础。DYLD_LIBRARY_PATH
(Mac),LD_LIBRARY_PATH
(Linux),如果我还记得,PATH
(Windows)。这是一个我没有在Mac上的clang中设置rpath的示例。
包
运行脚本
#!/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