引用Linux可执行文件的库

时间:2010-01-20 15:36:18

标签: java linux gcc executable gcj

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

这个想法是使静态字段“sys_paths”为null ,以便它从更改的值构造路径。 请参阅此处的帖子(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/gcj

一起使用

来自gcj手册(上面的链接):

- main = CLASSNAME

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

<强> -Dname [=值]

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

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

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

答案 1 :(得分:0)

回答问题的第一部分 -

从gcj手册页: “libgcj的静态链接可能导致libgcj的基本部分被省略.libgcj的某些部分使用反射来在运行时加载类。由于链接器在链接时没有看到这些引用,它可以省略引用的类。结果是通常(但不总是)在运行时抛出“ClassNotFoundException”。使用此选项时必须小心。“

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

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

答案 2 :(得分:0)

你为什么要使用AOT?我建议阅读following article。它为AOT提到的缺点之一是......

  

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