引用Linux可执行文件的库

我已经用Java编写了一个应用程序,并使用gcj成功编译了它。 它工作得非常好,但是我遇到了一个障碍:我只能通过shell脚本运行可执行文件,因为我必须指定库path。

我需要的库是SWT,Xerces和GNU-crypto。

有没有办法在gcj编译时静态链接库,或者这不是一个好主意? 或者,我可以在编译时指定(相对)库path吗?

目前,我的shell脚本如下所示:

 #!/bin/sh export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH exec ./MyJavaApp $* 

这个想法是使静态字段“sys_paths”为空,以便它从修改的值构造路径。 看到这里的帖子(由AjaySingh516发布#223) http://forums.sun.com/thread.jspa?messageID=3744346#3744346

 Class clazz = ClassLoader.class; Field field = clazz.getDeclaredField("sys_paths"); boolean accessible = field.isAccessible(); if (!accessible) field.setAccessible(true); Object original = field.get(clazz); // Reset it to null so that whenever "System.loadLibrary" is called, it // will be reconstructed with the changed value. field.set(clazz, null); try { // Change the value and load the library. System.setProperty("java.library.path", "./libs/"); System.loadLibrary("mylibapr"); } finally { // Revert back the changes. field.set(clazz, original); field.setAccessible(accessible); } 

gcj系统属性 (请参阅:libgcj支持的标准属性)

http://gcc.gnu.org/onlinedocs/gcj/System-properties.html

解决方案2 :在编译时设置系统环境变量

http://linux.die.net/man/1/gcj

为此,您必须使用参数-Djava.library.path=./libs/ with gcj

从gcj手册(上面的链接):

–main = CLASSNAME

链接时使用此选项来指定运行结果可执行文件时应调用“main”方法的类的名称。

-dname [=值]

该选项只能与“–main”一起使用。 它定义了一个名为value的系统属性。 如果未指定值,则默认为空字符串。 这些系统属性在程序启动时初始化,可以在运行时使用“java.lang.System.getProperty”方法检索

我从来没有使用gcj,但根据文档,这些系统属性可以在运行时检索,因此它也可以移植到其他系统。

另见: http : //gcc.gnu.org/wiki/Statically_linking_libgcj?action=show&redirect=Statically+linking+libgcj

回答你的问题的第一部分 –

在gcj手册页中:“libgcj的静态链接可能会导致libgcj的重要部分被忽略,libgcj的某些部分在运行时使用反射来加载类,因为链接器在链接时没有看到这些引用,所以可以省略参考到结果通常(但不是总是)在运行时抛出“ClassNotFoundException”,使用这个选项时必须小心。

对于其他库的静态链接,我不确定。 我没有理由这样做。

Linux可执行文件与Windows不同。 通常情况下,你有一个“启动器”或一些这样的取决于你正在使用的确切窗口系统。 你在那里设置图标,而不是在可执行文件本身。 通常,启动脚本用于设置运行可执行文件所需的任何环境。 再次,这一切都取决于你的确切的桌面窗口系统。

你为什么使用AOT? 我会建议阅读以下文章 。 它提到的AOT的缺点之一是…

动态应用程序 应用程序在运行时动态加载的类可能对应用程序开发人员不可用。 这些可以是第三方插件,动态代理和其他在运行时生成的类等等。 所以运行时系统必须包含一个Java字节码解释器和/或一个JIT编译器。