【发布时间】:2017-08-02 14:04:03
【问题描述】:
我正在使用 GDAL 本机库(C++,它安装在 /usr/lib/java/gdal 中)。不久前我发现了一个技巧,让 Tomcat 可以加载 Web 应用程序和这个库(不能使用 System.load() 或 System.loadLibrary() 因为都会返回错误)
Caused by: java.lang.UnsatisfiedLinkError: org.gdal.osr.osrJNI.new_SpatialReference__SWIG_1()J
然后我需要使用一个技巧,在应用程序启动时将库路径添加到JVM:
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
// get array of paths
final String[] paths = (String[]) usrPathsField.get(null);
// check if the path to add is already present
for (String path : paths) {
if (path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length - 1] = pathToAdd;
usrPathsField.set(null, newPaths);
这在 Tomcat 启动应用程序时效果很好,但是,如果我重新部署应用程序,它将返回错误:
原因:java.lang.UnsatisfiedLinkError: Native Library /usr/lib/java/gdal/libgdaljni.so 已经加载到另一个类加载器中
我在 StackOverflow 中找不到任何解决方案,所以我在这里询问是否有人可以提供一些信息。我也无法更改或添加环境变量或 Tomcat 文件夹的库路径,所有这些都只能在 Java 代码中完成。
【问题讨论】:
-
似乎它必须创建一个 jar 并放入 Tomcat lib 然后它可以毫无问题地启动任何使用本机库的应用程序,coderanch.com/t/474442/java/…
标签: java c++ tomcat java-native-interface gdal