2013-04-05 2 views
3

Je le code C suivant mis en œuvre en faisant référence à un fichier d'en-tête déjà généré avec JNI:Problèmes avec la compilation 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; 
} 

Lorsque je tente de le compiler (pour générer la sorte de bibliothèque) en utilisant:

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

J'ai eu cette erreur:

/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 

Comment puis-je résoudre ce problème?

Répondre

3

vous devez ajouter l'option de liaison -shared

d'abord créer le fichier d'objet:

cc -c HelloWorld.c 

Créez ensuite si

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

J'ai eu la même erreur que l'OP. Je parviens à exécuter la première commande correctement, cependant, après avoir exécuté la deuxième commande je reçois ceci:/usr/bin/ld: HelloWorld.o: la relocalisation R_X86_64_32 contre '.rodata 'ne peut pas être utilisée lors de la création d'un objet partagé; recompiler avec -fPIC HelloWorld.o: erreur lors de l'ajout de symboles: Bad value collect2: erreur: ld a renvoyé 1 statut de sortie Des idées? – hadis

+0

@hadis vous avez probablement besoin de compiler avec -fPIC comme le suggère l'erreur – msam

+0

Cela a fonctionné, merci. – hadis

-3

Vous devez ajouter la fonction principale. ajouter

int main(){ 
return 0; 
} 

, ou bien int main(char *argv[], int argc)

+0

C'est une bibliothèque; vous n'avez pas besoin d'une fonction principale. –