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

Java JNI包装库寻找错误的工作目录——如何规避?,java,java-native-interface,Java,Java Native Interface,我正在使用JNI在一个封闭的源代码中封装一些本机函数。它有一个从属的font目录,该目录必须位于调用应用程序目录的子文件夹中。根据我的经验,基于当前工作目录进行搜索是标准的。因此,问题就来了 将JNI代码加载到Java应用程序时,当前工作目录是正确的。但是,调用应用程序的目录是java.exe的bin目录。我已经验证了将依赖的字体文件夹放在C:\ProgramFiles(x86)\Java\jre6\bin文件夹中是否可以正常工作 库似乎使用C++ GETCOMPRIDLY()/调用,或者类似

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

将JNI代码加载到Java应用程序时,当前工作目录是正确的。但是,调用应用程序的目录是
java.exe
的bin目录。我已经验证了将依赖的
字体
文件夹放在
C:\ProgramFiles(x86)\Java\jre6\bin
文件夹中是否可以正常工作

库似乎使用C++ <代码> GETCOMPRIDLY()/<代码>调用,或者类似的东西来确定字体目录应该在哪里。显然,这是一个不可接受的解决办法

我希望避免调用外部EXE。但我想到的唯一解决办法是:

  • 编译一个EXE,放入Java项目目录,并使用Java的
    Runtime.exec()
    执行。(这确实有效)
  • 让JNI代码启动一个单独的流程,该流程与上述流程相同(只会增加复杂性)

有什么办法可以绕过这个问题吗?当Java应用程序被编译为可运行JAR时,生成的命令行仍然是JRE的
C:\Program Files\…Java.exe吗?

Java可执行文件生成器可以从Java应用程序创建可执行文件*.exe,而无需任何本机编码或编译。您可以将可执行文件、jar文件、字体和其他应用程序依赖项放在一个安装目录中


是一个可执行的制造商,将支持这一点,为Windows。它不需要对当前工作目录进行任何假设。这在启动应用程序时无法控制工作目录的情况下非常重要。

我无法让GetCommandLine()返回完整路径,因此无法测试它,但是,您是否尝试在正确的目录中创建指向java.exe的符号链接并使用它来启动您的程序?这听起来像是可行的解决方案;标记为已接受。我发现了一些开源的替代方案,也可以创建前男友。考虑到这个项目将具有额外的(不相关的)依赖关系,我将暂时只使用
Runtime.exec
。这个关于在运行时从JAR中提取EXE的链接可能是一个有用的参考--