Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Mac OS X上加载JNI库?_Java_Macos_Java Native Interface_Jogl - Fatal编程技术网

Java 在Mac OS X上加载JNI库?

Java 在Mac OS X上加载JNI库?,java,macos,java-native-interface,jogl,Java,Macos,Java Native Interface,Jogl,背景 因此,我试图在运行时将jnilib(特别是)加载到MacOSX上的Java中。我一直在关注相关的堆栈溢出问题: 我的最终目标是将特定于平台的JOGL文件打包到一个JAR中,并将它们解压缩到一个临时目录中,然后在启动时加载它们。我将问题归结为简单地尝试使用硬编码路径加载JOGL: File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib"); System.

背景

因此,我试图在运行时将jnilib(特别是)加载到MacOSX上的Java中。我一直在关注相关的堆栈溢出问题:

我的最终目标是将特定于平台的JOGL文件打包到一个JAR中,并将它们解压缩到一个临时目录中,然后在启动时加载它们。我将问题归结为简单地尝试使用硬编码路径加载JOGL:

    File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib");
    System.load(f.toString());
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib");
    System.load(f.toString());
我在尝试使用JOGL API时遇到以下异常:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path
但是当我通过添加以下JVM选项指定
java.library.path
时:

    -Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 
一切正常


问题

是否可以在Mac OS X上使用
System.load
(或其他变体)替换运行时调用的-Djava.library.path?

System.load(…)
以libraryName为参数。它不以库的路径作为参数。 JVM在
-Djava.library.path中指定的路径列表中搜索具有指定名称的库


这里没有特定于Mac OS X的内容。它在所有操作系统上以相同的方式搜索库。

启动时不必提供
java.library.path
。您可以通过编程将其设置为

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/");

我不知道如果没有这个库路径,
System.load()
是否能正常工作。

Jogl总是尝试自动加载所有相关库。
为了避免这种情况,应该有一个NativeLibLoader类,您可以在通过System.load()自己加载库之前调用disableLoading()

这是错误的,实际上,System.load()将采用完整的文件名,System.loadLibrary将采用库名。我认为加载jnilib是特定于mac的(在我的情况下)。我让它在Linux(.so)上工作,编译后在mac上jnilib不会加载。我使用mvnjetty:deploywar-Djava.library.path=/path/to/jnilib。我甚至使用过System.setProperty(“mylib.systemclassloader”,“false”);因此它将在servlet环境中运行(它禁用该库的自动加载)。原因可能是什么?谢谢你的建议。然而,根据我的经验,在运行时设置“java.library.path”没有任何效果。我认为这可能是由于类似的原因,比如为什么不能在运行时更改类路径——那么您可能会遇到另一个依赖库的问题。在运行时设置lib路径效果非常好,我以前加载我的库就是这样的。这不完全正确,有一种方法可以强制使用新的lib.path重新初始化类加载器。执行如下操作:System.setProperty(“java.library.path”,newPath);Field fieldSysPath=ClassLoader.class.getDeclaredField(“sys_路径”);fieldSysPath.setAccessible(true);fieldSysPath.set(null,null);好极了!感谢您的支持,在手动加载库之前调用NativeLibLoader.disableLoading()非常有效。