eclipse - 在 SWT 插件中打包 GDAL JAVA 绑定(bind)和 native 库

标签 eclipse plugins java-native-interface swt native

我要打包GDAL并将其 JAVA 绑定(bind)到一个 SWT 插件中。
(P.S. GDAL 使用 swig 生成 Java 绑定(bind))

我拥有所有必要的本地库,并希望将它们打包到我的 Eclipse 插件中,让其他人无需在他们的计算机上安装 GDAL 即可使用它。

问题是 JAVA 绑定(bind)(或本地库本身)将从 中查找必要的本地库。路径 (窗口)或 LD_LIBRARY_PATH (Linux) 而是在相对位置查找这些库。此外,GDAL 会从环境变量 中查找一些必要的地理定义数据。 GDAL_DATA 也是。

如何解决这两个问题来制作可移植的 SWT 插件?
1) 打包平台特定的原生库
2)一些环境变量查找

如果没有设置 PATH,eclipse 似乎无法解析依赖库。
Bundle-NativeCode(见下文)不起作用。

如果我尝试在我的插件中直接调用 System.Library("SomethingNotExist") ;
然后我得到

java.lang.UnsatisfiedLinkError: no SomethingNotExist in java.library.path

如果我在插件中调用 System.Library("SomethingDoesExist") ,那么我会得到
java.lang.UnsatisfiedLinkError: SomethingDoesExist.dll: Can't find dependent libraries

我的插件中的文件结构
org.gdal/
   + src/
   + nativelib/
      + linux32/
        + ...
      + linux32/
        + ...
      + win32/
        + ...
      + win64/
        + ...
   + META-INF
      + MANIFEST.MF
   + gdal-data/
   + gdal.jar
   + build.properties

此插件的 build.properties
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               gdal.jar,\
               gdal-data/,\
               nativelib/

此插件的 list
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: GDAL
Bundle-SymbolicName: org.gdal
Bundle-Version: 1.8.1
Bundle-NativeCode: 
 nativelib/linux32/libgdal.so;
 nativelib/linux32/libgdalconstjni.so;
 nativelib/linux32/libgdaljni.so;
 nativelib/linux32/libogrjni.so;
 nativelib/linux32/libosrjni.so;
 osname=Linux; processor=x86,
 nativelib/linux64/libgdal.so;
 nativelib/linux64/libgdalconstjni.so;
 nativelib/linux64/libgdaljni.so;
 nativelib/linux64/libogrjni.so;
 nativelib/linux64/libosrjni.so;
 osname=Linux; processor=x86_64,
 nativelib/win32/gdal18.dll;
 nativelib/win32/gdalconstjni.dll;
 nativelib/win32/gdaljni.dll;
 nativelib/win32/geos_c.dll;
 nativelib/win32/iconv.dll;
 nativelib/win32/libcurl.dll;
 nativelib/win32/libeay32.dll;
 nativelib/win32/libexpat.dll;
 nativelib/win32/libmysql.dll;
 nativelib/win32/libpq.dll;
 nativelib/win32/libxml2.dll;
 nativelib/win32/ogrjni.dll;
 nativelib/win32/openjpeg.dll;
 nativelib/win32/osrjni.dll;
 nativelib/win32/pdflib.dll;
 nativelib/win32/proj.dll;
 nativelib/win32/spatialite.dll;
 nativelib/win32/sqlite3.dll;
 nativelib/win32/ssleay32.dll;
 nativelib/win32/xerces-c_2_8.dll;
 nativelib/win32/zlib1.dll;
 osname=win32; processor=x86,
 nativelib/win64/ogrjni.dll;
 nativelib/win64/gdal18.dll;
 nativelib/win64/xerces-c_2_8.dll;
 nativelib/win64/libexpat.dll;
 nativelib/win64/libpq.dll;
 nativelib/win64/spatialite.dll;
 nativelib/win64/libmysql.dll;    
 nativelib/win64/geos_c.dll;
 nativelib/win64/libcurl.dll;
 nativelib/win64/openjpeg.dll; 
 nativelib/win64/iconv.dll; 
 nativelib/win64/libeay32.dll;
 nativelib/win64/gdaljni.dll;
 nativelib/win64/osrjni.dll; 
 nativelib/win64/gdalconstjni.dll; 
 nativelib/win64/libxml2.dll; 
 nativelib/win64/pdflib.dll;
 nativelib/win64/proj.dll;
 nativelib/win64/sqlite3.dll;
 nativelib/win64/ssleay32.dll;
 nativelib/win64/zlib1.dll; 
 osname=win32; processor=x86_64
Bundle-ClassPath: gdal.jar,
 .,
 gdal-data/
Export-Package: org.gdal,
 org.gdal.gdal,
 org.gdal.gdalconst,
 org.gdal.ogr,
 org.gdal.osr
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

最佳答案

Java中GDAL的环境问题

使用 gdal.SetConfigOption
http://osgeo-org.1560.n6.nabble.com/gdal-dev-GDAL-DATA-td3744017.html

使用可以从插件包中读取的文件夹设置 GDAL_DATA。

http://www.vogella.de/blog/2010/07/06/reading-resources-from-plugin/

关于eclipse - 在 SWT 插件中打包 GDAL JAVA 绑定(bind)和 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8646356/

相关文章:

java - 如何从 Maven 插件访问 Maven 占位符?

grails - 如果我想在 Grails 中拥有自己的插件架构怎么办?

java - 如何对使用 JNI 的库进行单元测试?

java - 具有多行文本文件的输入流读取器

eclipse - 在 Eclipse 中运行 Map Reduce 程序

Facebook Like Box 插件无法在网页测试中运行

android - 在 JNI 中获取字符串列表的正确方法

java - JNI - 从 C++ 调用 Java 方法时如何修改参数?

java - 递归方法计算人在金字塔中支撑的重量

java - 将 Android 项目导入 Eclipse