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?
Bitte posten Sie alle Befehle zum Erstellen der Bibliothek. Außerdem sollte diese Frage wahrscheinlich in zwei getrennte Fragen aufgeteilt werden. –
Wild rate, aber vielleicht einige Namen Mangling-Probleme - Sind Funktionsdeklarationen, die Sie von JAVA in externen "C" Block gewickelt laufen? –