如何在任意位置使用带有关联库的JNI库?

时间:2014-11-25 15:56:50

标签: java windows macos java-native-interface environment-variables

我们有一个应用程序,有时与相关的应用程序一起安装。两者都可以在不同时间单独安装,并且通常都不在OS路径环境设置中。

如果安装了这两个应用程序,我正在处理的应用程序需要使用其他应用程序中的JNI库。该库使用十几个其他本机库。虽然我可以找到JNI lib,但我似乎无法找到使用它的方法而无需用户更改其系统设置。

我找到了(hacky)技术将JNI lib添加到java.library.path,我一直无法找到更新本机Path的任何方法,因此JNI lib可以找到它的关联库。 / p>

到目前为止,唯一有效的方法是:

  1. 在启动我们的应用程序之前,将JNI及其相关文件所在的文件夹添加到操作系统路径中。

  2. 启动我们的应用程序,以便当前工作目录是JNI lib文件夹。

  3. 这两者都无法实现轻松的用户体验。

    那么,有没有办法让Java应用程序修改它自己的环境路径,以便JNI lib可以找到它的相关本机库? (目前在Win7上测试,还需要支持OS / X)

2 个答案:

答案 0 :(得分:0)

在运行时无法使用未知位置。根据jni文档

"To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:"

以及

"Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages)."

因此,您需要知道位置,并且必须位于能够加载文件的路径中。如果该位置未知,则由于jni的工作方式和jvm的工作原理无法完成。

答案 1 :(得分:0)

使用依赖库加载JNI库的一种方法是加载每个依赖项,然后加载JNI库。

例如,如果bar.so依赖于foo.so并且两个库都存在于/ some / dir中,请执行以下操作:

System.load("/some/dir/foo.so");
System.load("/some/dir/bar.so");

使用System.load()而不是System.loadLibrary(),以便指定库的绝对路径。

您必须加载所有已加载库的所有依赖项,除非它们可以在java.library.path路径中找到。

希望这有帮助。