2010-12-10 47 views
2

J'ai deux fichiers de bibliothèque 3ème partie appelée libA.a et libB.ag ++, ld et JNI - problème reliant

Ils sont construits avec g ++.

Maintenant, j'ai besoin de faire des appels de fonction à partir de Java en utilisant JNI.

J'ai un fichier wrapper JNI appelé wrapper.cpp et j'ai essayé de créer un fichier library.so qui peut être chargé dans mon programme java et faire des appels de fonction.

J'ai d'abord compilé wrapper.cpp en utilisant g ++ et essayé de lier tous les fichiers objets en utilisant ld.

Voici les commandes que j'ai utilisées.

%g++ wrapper.cpp -I /usr/java/include/ -I /usr/java/include/solaris/ libA.a libB.a -L /lib/*.so -c 

Cela a créé wrapper.o

%ld -L /usr/java/lib/ -L /lib/ -b wrapper.o libA.a libB.a -o wrapper.so -m 

Cela me donne l'erreur suivante:

Undefined      first referenced 
symbol        in file 
_ZNKSsixEj       wrapper.o 
_ZNSt8ios_base4InitD1Ev    wrapper.o 
_ZNSt8ios_base4InitC1Ev    wrapper.o 
__gxx_personality_v0    wrapper.o 
_ZNKSs4sizeEv      wrapper.o 
ld: fatal: Symbol referencing errors. No output written to wrapper.so 

recherche sur Google ces erreurs ne vous aide pas :(

Quelqu'un peut-il me dire s'il vous plaît Où est-ce que je vais mal?

Note: J'utilise g ++ 3.4.3 sur SunOS 5.10

Répondre

4

Essayez d'ajouter -lstdC++ à votre commande d'éditeur de liens. Vous pourriez aussi avoir besoin de --enable-auto-import.

+0

A travaillé. Merci :) – JohnH

0

Utilisation de clang ++. -lstdC++ n'a pas le symbole _ZNSt8ios_base4InitC1Ev défini. Essayez d'ajouter la bibliothèque -lgnustl_shared à votre commande d'éditeur de liens. Cela a fonctionné pour moi.