2017-05-18 5 views
1

Ich bin neu in C++ und versuchen, eine .so-Datei zu kompilieren, um es über JNI in Java zu starten.JNI/C++ kompilieren Probleme

Die Verzeichnisstruktur des C++ Ordner ist:

/ 
/lib/ - this contains a .a file = library.a below 
/folder1 - this contains the .cpp .h and .o files 

Szenario 1:

Ich bin mit dem folgenden:

g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -Llib -llibrary.a -fPIC -shared 

ich die folgende Fehlermeldung erhalten:

relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC 

Alle Dateien und das .so-Objekt hatten das Flag -fPIC. Was ist das Problem?

Szenario 2:

Ich bin mit der folgenden:

g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -shared 

So ohne -L und -l-Flags.

Ich bekomme die .so-Datei und legte es in/usr/lib mit der entsprechenden Bezeichnung, d. H. "Lib" -Präfix. Wenn ich Java-Programm ausführen, erhalte ich:

symbol lookup error: /usr/lib/outputFileName.so: undefined symbol: _ZN3... 

I C++ filt verwenden Sie das Symbol zu dekompilieren und ich bekomme einen Verweis auf eine Klasse wie folgt:

namespace::Class::Constructor 

ich die CPP-Datei überprüft der Die Klasse und der Konstruktor existieren.

Hilfe bitte?

+0

Bitte posten Sie alle Befehle zum Erstellen der Bibliothek. Außerdem sollte diese Frage wahrscheinlich in zwei getrennte Fragen aufgeteilt werden. –

+0

Wild rate, aber vielleicht einige Namen Mangling-Probleme - Sind Funktionsdeklarationen, die Sie von JAVA in externen "C" Block gewickelt laufen? –

Antwort

1

Hier finden Sie einen Beispielcode, in dem Sie sehen können, wie JNI andere gemeinsam genutzte Bibliothek verwenden kann.

https://github.com/mkowsiak/jnicookbook/blob/master/recipeNo023/Makefile

Es sieht aus wie Sie zu irgendeiner Art von Libs beziehen, die durch Ihre .so-Datei verwendet werden.

Stellen Sie sicher, dass Sie sie in Ihrem LD_LIBRARY_PATH haben - nicht nur in Ihrer JNI-Bibliothek.

Verwandte Themen