Java JNI包装库寻找错误的工作目录——如何规避?
我正在使用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()/调用,或者类似
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的链接可能是一个有用的参考--