2013-04-05 121 views
3

我已經通過參考與JNI已經生成的報頭文件中實現以下的C代碼:麻煩與編譯JNI

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

JNIEXPORT void JNICALL 
Java_HelloWorld_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
    return; 
} 

當我試圖編譯它(以產生這樣的庫),使用:

cc -g -I/usr/lib/jvm/java-7-openjdk/include 
-I/usr/lib/jvm/java-7-openjdk/include/linux HelloWorld.c -o libHelloWorld.so 

我得到這個錯誤:

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

我怎樣才能解決這個問題?

回答

3

你必須添加-shared連接選項

首先創建對象文件:

cc -c HelloWorld.c 

然後創建這樣

cc -shared -o libHelloWorld.so HelloWorld.o 
+0

我和OP有同樣的錯誤。我設法正確運行第一個命令,但是,在運行第二個命令後,我得到這個:/ usr/bin/ld:HelloWorld.o:在創建共享對象時,無法使用針對'.rodata'的重定位R_X86_64_32;用-fPIC重新編譯 HelloWorld.o:錯誤添加符號:錯誤值 collect2:錯誤:ld返回1退出狀態 任何想法? – hadis 2018-02-01 22:00:11

+0

@hadis您可能需要使用-fPIC進行編譯,因爲錯誤提示 – msam 2018-02-05 10:20:33

+0

工作正常,謝謝。 – hadis 2018-02-05 17:18:19

-3

您需要添加主要功能。添加

int main(){ 
return 0; 
} 

,或者int main(char *argv[], int argc)

+0

這是一個圖書館;你不需要一個主要功能。 – 2013-04-05 08:36:04