2013-04-05 2 views
3

Я следующий код C реализован с помощью ссылки на файл заголовка уже сформировавшийся с JNI:Проблем с компиляцией 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 Linker

сначала создать объектный файл:

cc -c HelloWorld.c 

Затем создать так

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

У меня была такая же ошибка, как и у ОП. Мне удалось запустить первую команду правильно, однако после выполнения второй команды я получаю это:/usr/bin/ld: HelloWorld.o: перемещение R_X86_64_32 в отношении '.rodata 'не может использоваться при создании общего объекта; перекомпилировать с -fPIC HelloWorld.o: символы с добавлением ошибок: Плохое значение collect2: ошибка: ld возвращен 1 статус выхода Любые идеи? – hadis

+0

@hadis, вероятно, вам нужно скомпилировать с -fPIC, как подсказывает ошибка – msam

+0

Это сработало, спасибо. – hadis

-3

Вам нужно добавить основную функцию. добавить

int main(){ 
return 0; 
} 

, или в качестве альтернативы int main(char *argv[], int argc)

+0

Это библиотека; вам не нужна основная функция. –

Смежные вопросы