Java无法在OSX上加载带有JNI的共享对象库
我试图在我朋友的64位OSX上使用JNI以最简单的方式加入Java和C,我得到了这个错误。以下是所有相关内容: test.javaJava无法在OSX上加载带有JNI的共享对象库,java,c,java-native-interface,shared-libraries,Java,C,Java Native Interface,Shared Libraries,我试图在我朋友的64位OSX上使用JNI以最简单的方式加入Java和C,我得到了这个错误。以下是所有相关内容: test.java public class test { static {System.loadLibrary ("test");} native void aaa (); public static void main (String [] args) { new test (); } public test () {
public class test {
static {System.loadLibrary ("test");}
native void aaa ();
public static void main (String [] args) {
new test ();
}
public test () {
aaa ();
}
}
测试h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */
#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: aaa
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_aaa
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
我不得不使用-install_name而不是-soname,因为我读到OSX没有像Linux那样的-soname
那我会的
export LD_LIBRARY_PATH=.
java test
我得到
Exception in thread "main" java.lang.UnsatisfiedLinkError: no test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at test.<clinit>(test.java:2)
线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有测试
位于java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
位于java.lang.Runtime.loadLibrary0(Runtime.java:845)
位于java.lang.System.loadLibrary(System.java:1084)
测试时。(test.java:2)
所以我真的不知道问题出在哪里。我将所有文件复制到Linux上,并将-install_name切换到-soname,并将路径更改为jni.h,它工作正常。在OS X上,jni查找扩展名为
.jnilib
的库,或标准OS X共享库扩展名为.dylib
源代码:在某一点上——Java 1.4,IIRC——仅使用了
。jnilib
,因此如果需要与非常旧的运行时进行反向兼容,建议使用。但不管怎样,。所以
永远都是不对的。@EdwardThomson-干杯。我找到了一个更好的来源,并用它进行了更新。苹果似乎认为这是从OSX 10.5开始出现的,但这可能只是因为它附带的虚拟机。在OSX上,它是DYLD\u LIBRARY\u路径
,而不是LD\u LIBRARY\u路径
。
export LD_LIBRARY_PATH=.
java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: no test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at test.<clinit>(test.java:2)