不同平台的本地库Java项目

3

我有一个使用JOGL的Java项目,因此需要为不同平台包含不同的本地库。现在我想设置Eclipse项目以自动选择正确的库。在.classpath文件中,您可以指定一个本地位置:

<classpathentry kind="lib" path="lib/jogl/jar/jogl.all.jar">
    <attributes>
        <attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="de.yogularm.desktop/lib/jogl/windows-amd64"/>
    </attributes>
</classpathentry>

如果配置了多个classpath条目并指定了本地位置,Eclipse也会尝试加载其他平台的库,并失败。
我该如何让Eclipse选择目录呢?我想分享这个项目并使其对其他开发人员的设置尽可能简单。

你有试过这个吗?http://stackoverflow.com/questions/3618425/how-to-configure-eclipse-project-to-compile-both-on-windows-and-linux? - Viruzzo
这可能是一个不错的选择,但它缺乏对64位和32位系统的支持。 - Yogu
4个回答

4
你可以创建多个.classpath文件(.classpath_Windows,.classpath_Linux等),然后创建符号链接到所需版本(Win / Lin / Mac)并命名为".classpath"
当你想要更改任何.classpath_XXXXXXX中的条目时,问题就会出现-然后你将不得不更新其他.classpath文件。

3
Eclipse缺少您想要的功能。因此,您可以通过Java来实现它。
不要调用System.loadLibrary,而是调用System.load。这需要您编写代码来根据当前平台计算正确的路径名。您需要使用-D传递一个值来表示当前平台,或者从文件中读取它。
这将从方程式中删除java.library.path
如果您的JNI库具有依赖项,则还需要设置PATH、LD_LIBRARY_PATH或DYLD_LIBRARY_PATH。除非您进一步查看https://github.com/bimargulies/jni-origin-testbed。然而,对于Windows,延迟加载器的必要操作并未在其中。

非常有趣的答案,我很快就会尝试。 - Yogu
据我所见,我将不得不更改所引用的库的代码,而这是不可行的。但是,如果我自己编写库,你的答案将非常完美。 - Yogu
为什么要更改引用库的代码?我在做这件事时没有这样做。 - bmargulies
gluegen试图在类初始化时调用loadLibrary(),即使我在调用该类之前已经加载了本地库。 - Yogu
哦,是的,那会是一个问题。 - bmargulies

-1

我可能错了,但我认为本地库就是像DLL、共享对象等这样的东西,根本不会放在类路径上。每个环境都会有类似于PATH变量之类的东西,需要包含本地库。用户可能需要进行一些配置(无论是在Eclipse中还是通过环境变量)。


1
本地路径不包括在classpath中,它们只是在classpath文件中声明。Eclipse在调试时使用它们来设置PATH变量。如果只使用一个平台,则这没有问题,也肯定是预期的方式。 - Yogu
好的观点 - 我显然没有仔细阅读问题。 - user888379

-1

类路径、系统PATH和属性java.library.path中不会搜索库。

在您的情况下,可能是自定义ClassLoader实现,特别是findLibrary(..)loadLibrary(..)方法。这将允许根据检测到的操作系统选择适当的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接