2016-08-07 68 views
0

我試圖建立在OSX .c文件,但我不斷收到(適用於建築x86_64的未定義符號):JNI編譯C文件

Undefined symbols for architecture x86_64 

#include "Test.h" 

JNIEXPORT jint JNICALL Java_Test_test 
    (JNIEnv * env, jclass cls, jbyteArray s, jlong ss, jbyteArray sss, jlong ssss, jbyteArray sssss, jlong ssssss) { 

    /*printf("Hello World!\n");*/ 
    return 1; 
} 

建有:

clang++ -o test -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include/darwin Test.cpp 

Undefined symbols for architecture x86_64: "_main", referenced from: 
    implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

有什麼我需要安裝嗎?

回答

0

clang++ -o test Test.cpp正在嘗試編譯和鏈接以生成可運行的可執行文件。你沒有定義main(),所以當然當它試圖鏈接CRT代碼失敗(它調用用戶提供main()。)

也許你想用clang++ -fPIC -shared -o libtest.so Test.cpp -I...(保持所有其他選項相同),使像JNI這樣的共享庫需要。或者.dylib.jnilib,通常在您的平臺上調用任何庫。

如果你正在關注的教程沒有告訴你如何編譯你的代碼,這可能不是一個很好的教程,你應該找到更好的文檔。

+1

可能不是正確的答案,因爲JNI模塊是一個共享對象,您將生成一個直接的目標文件。 –

+0

@MichaelPetch:對啊,這很有道理。 「-fPIC -shared」應該是正確的,IIRC。 –

+1

OP說OSX所以它可能應該是'.dylib'或'.jnilib'(我給文件一個'lib'前綴,而不是現在缺少'-o'的命令?) – user2543253