我已用Java编写的应用程序并成功地使用编译它 GCJ 。它的工作出奇地好,但我碰到的一个障碍:我只能通过运行一个shell脚本可执行文件,因为我必须指定库路径

我所需要的库是SWT,Xerces和GNU-加密。

有没有办法在gcj编译时静态链接库,还是这不是一个好主意?可替换地,在编译时可以我指定的(相对)库路径?

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

#!/bin/sh
export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH
exec ./MyJavaApp $*
有帮助吗?

解决方案

<强>我们的想法是,使静磁场“sys_paths”空以便它会从所述改变后的值构建的路径。 在这里看到后(POST#223 AjaySingh516) 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手册(以上链接):

<强> - 主= CLASSNAME

链接到指定其“main”方法运行生成的可执行文件时,应调用的类的名字时,该选项被使用。

<强> -Dname [=值]

这个选项只能用“ - 主”使用。它定义了值值名为名称的系统属性。如果没有指定值,则默认为空字符串。的这些系统特性是在该程序的启动时进行初始化,并可以在运行时被检索使用“java.lang.System.getProperty”的方法。

我从来没有与GCJ工作,但按照这些文档系统属性可以在运行时被检索,因此这将是移植到其他系统,以及

另请参见: HTTP://gcc.gnu。组织/维基/ Statically_linking_libgcj?动作=显示&重定向=静态+联的libgcj +

其他提示

要回答你的问题的第一部分 -

从GCJ手册页: “静态的libgcj的连接可能在运行时会导致被省略的libgcj的主要部分。libgcj里使用反射的某些部分加载类。由于接头没有看到在链接时这些参考文献中,它可以省略称为类。其结果是通常(但不总是)一个“ClassNotFoundException的”被在运行时抛出。注意必须使用此选项时,可以使用“。

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

Linux可执行比视窗不同。通常情况下,你有一个“启动”,或者你使用一些这样的,这取决于精确的视窗系统。您在设置的图标,而不是可执行文件本身。通常情况下,启动脚本是用于设置你需要运行可执行任何环境。同样,这一切都取决于你的确切桌面视窗系统上。

为什么要使用AOT?我会建议您阅读下面的文章。之一,它提到了AOTS的缺点之一是如下...

  

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top