2 Stimmen

MinGWs Compiler-Option Wl,--kill-at funktioniert nicht

Ich bin derzeit kämpfen, um eine Dll für JNI verwenden, mit Eclipse CDT und MinGW zu kompilieren.

Nach einem Tutorial habe ich eine Java-Klasse erstellt, die native Methoden deklariert, dann mit javah die entsprechende Header-Datei abgerufen und in eine C++-Klasse implementiert.

Der C++-Code ist sehr einfach und die Kompilierung funktioniert, aber wenn ich die Bibliothek in die Java-Klasse lade, bekomme ich diesen Fehler:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I
    at Main.integerMethod(Native Method)
    at Main.main(Main.java:12)

Ich habe die DLL "erforscht" und herausgefunden, dass die Methoden, die aufgerufen werden sollen, alle ein Suffix wie "@14" haben. Das Problem ist, dass ich bereits die Compileroption -Wl,--kill-at verwende, die diese sehr peinlichen Tags entfernen sollte... Warum funktioniert es also nicht?

Das Kompilierungsprotokoll lautet wie folgt:

**** Rebuild of configuration DLL for project JniCTest ****

**** Internal Builder is used for build               ****
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
Build complete for project JniCTest
Time consumed: 375  ms.  

Stimmt etwas mit den Compiler-Optionen nicht? Danke für jede Hilfe.

3voto

Dunaril Punkte 2707

Lösung gefunden. Die Option --kill-at wurde nicht in den richtigen Befehl eingefügt. In der Tat kompiliert MinGW zuerst die Dateien in eine .o-Objektdatei und führt dann (zweite Zeile) das Linken aus dieser .o-Datei durch. Die Option muss daher in die zweite Zeile gesetzt werden.

Korrigierte Befehle für eine Quelldatei Main.cpp und eine Ausgabe-DLL libJniCTest.dll :

g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o

0voto

Jonah Punkte 1

Vergessen Sie auch nicht, Ihre Implementierung wie folgt zu verpacken

extern "C" {

//implemented methods

}

Ich habe Stunden gebraucht, um das herauszufinden.

0voto

Sorter Punkte 8826

Ich habe diese einfache JNI-Tutorial o und kompilierte die angegebene Datei Sample1.c mit dem folgenden Befehl auf Windows XP . Bei mir funktioniert es einwandfrei.

gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"

P.S.: Ändern Sie den JDK-Pfad entsprechend Ihrem System.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X