Java在OSX上使用JNI时无法加载共享对象库

4
我将尝试使用JNI在我朋友的64位OSX上以最简单的方式将Java和C连接起来,但我遇到了这个错误。以下是所有相关内容:
test.java
public class test {

    static {System.loadLibrary ("test");}

    native void aaa ();

    public static void main (String [] args) {
        new test ();
    }

    public test () {
        aaa ();
    }
}

test.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

test.c

#include <stdio.h>
#include <jni.h>
#include "test.h"

JNIEXPORT void JNICALL Java_test_aaa
  (JNIEnv *env, jobject obj) {
    printf ("AWD");
}

makefile

CC          =   gcc
CFLAGS      =   -Wall -ansi -pedantic -g3

default :
    javac test.java
    javah -jni test
    gcc -c test.c -o test.o -I${HOME}/../../System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
    gcc -shared -Wl,-install_name,libtest.so -o libtest.so test.o

我需要使用 -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)

所以我真的不知道问题出在哪里。我将所有文件复制到Linux并将 -install_name 更改为 -soname,同时更改了 jni.h 的路径,现在它可以正常工作。


在OSX上,应该使用DYLD_LIBRARY_PATH而不是LD_LIBRARY_PATH - technomage
1个回答

6

1
在某个时候 - Java 1.4,如果我没记错的话 - 只使用了.jnilib,因此如果需要向非常旧的运行时兼容,建议使用它。但无论如何,.so都是不正确的。 - Edward Thomson
@EdwardThomson- 谢谢。我找到了一个更好的来源并更新了它。苹果似乎认为这发生在OS X 10.5之后,但那可能仅是由于随附的虚拟机。 - slugonamission

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接