2013-02-16 106 views
3

我正嘗試使用JNI以最簡單的方式在我的朋友的64位OSX上加入Java和C,並且出現此錯誤。這裏的一切涉及:Java無法在OSX上使用JNI加載共享對象庫

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,並且它工作得很好。

+0

在OSX它的'DYLD_LIBRARY_PATH',不'LD_LIBRARY_PATH'。 – technomage 2013-02-16 04:33:30

回答

5

在OS X上,JNI查找擴展名爲.jnilib的庫或標準的OSX共享庫擴展.dylib

來源:http://developer.apple.com/library/mac/#documentation/Java/Conceptual/Java14Development/05-CoreJavaAPIs/CoreJavaAPIs.html

+1

有一點--Java 1.4,僅使用了IIRC - '.jnilib',所以如果需要使用非常老的運行時反編譯的話,建議這樣做。但不管怎樣,'.so'永遠不會是正確的。 – 2013-02-16 00:31:57

+0

@愛德華湯姆森 - 歡呼聲。我發現了一個更好的來源並更新了它。蘋果似乎認爲它發生在OS X 10.5之後,但這可能只是由於它附帶的虛擬機造成的。 – slugonamission 2013-02-16 00:34:45

相關問題