JNI包装的库寻找错误的工作目录 - 如何规避?

时间:2010-12-16 16:51:09

标签: java java-native-interface

我正在使用JNI在封闭源PDF library中包含一些本机函数。它有一个从属fonts目录,该目录必须位于调用应用程序目录的子文件夹中。根据我的经验,基于当前工作目录进行搜索是标准的。因此,问题。

将JNI代码加载到Java应用程序时,当前工作目录是正确的。但是,调用应用程序的目录java.exe的bin目录。我已经验证将fonts文件夹中的依赖C:\Program Files (x86)\Java\jre6\bin文件夹按预期工作。

库似乎正在使用C ++ GetCommandLine()调用,或类似的东西来确定fonts目录的位置。显然,这是一个不可接受的解决方案。

我想避免拨打外部EXE。但我提出的唯一解决方法是:

  • 编译EXE,放在Java项目目录中,并使用Java的Runtime.exec()执行。 ( 工作)
  • 使JNI代码启动一个单独的过程,与上面相同(只获得更多复杂性)

关于如何规避这个问题的任何想法?当Java应用程序编译为可运行的JAR时,结果命令行仍然是JRE的C:\Program Files\...java.exe

1 个答案:

答案 0 :(得分:2)

Java可执行文件制作者可以从Java应用程序创建可执行的* .exe,而无需任何本机编码或编译。您可以将该可执行文件,jar文件,字体和其他应用程序依赖项放入单个安装目录中。

Exe4j是支持Windows的可执行程序制造商之一。它不需要关于当前工作目录的任何假设。这对于在启动应用程序时无法控制工作目录的常见情况非常重要。