我将尝试使用JNI在我朋友的64位OSX上以最简单的方式将Java和C连接起来,但我遇到了这个错误。以下是所有相关内容:
test.java
我需要使用 -install_name 而不是 -soname,因为我读到了OSX并没有像Linux一样的-soname。
然后我执行以下操作:
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 的路径,现在它可以正常工作。
DYLD_LIBRARY_PATH
而不是LD_LIBRARY_PATH
。 - technomage