JNI C ++ - DLL - 'UnbefriedigterLinkError:% 1 ist keine gültige Win32-Anwendung'

8

Ich versuche tatsächlich, JNI zum Laufen zu bringen, bevor ich mit meinem eigentlichen Code eintauche, aber nachdem ich eine DLL von C ++ kompiliert habe und meine Java-Anwendung ausgeführt habe, bekomme ich:

%Vor%

Nachdem ich dies ein wenig gegoogelt habe, weiß ich, dass dies normalerweise dadurch verursacht wird, dass ich versuche, eine 64-Bit-DLL mit einer 32-Bit-JVM zu laden. Meine JVM ist jedoch 64 Bit, wie aus sun.arch.data.model gleich 64 hervorgeht.

Mein Makefile:

%Vor%

JNITest.java:

%Vor%

jnitest.h wie von javah generiert:

%Vor%

jnitest.cpp:

%Vor%

Wer weiß, warum das nicht funktioniert?

Bearbeiten: java.library.path zeigt definitiv auf native , wie in einer Eclipse-Laufkonfiguration eingerichtet.
Bearbeiten 2: Die DLL funktioniert, wenn ich kompiliere es mit VS2013, aber ich wirklich möchte nicht mein Projekt an Visual Studio binden, wenn ich es helfen kann.

    
condorcraft110 II 09.02.2015, 19:47
quelle

1 Antwort

6

Für mich bestand das Problem darin, dass meine neu hinzugefügte DLL auf anderen DLLs basierte, die ich nicht kannte. Windows ging hilfreich aus und fand eine 32-Bit-Version in meinem Pfad, aber konnte es nicht laden, da meine Anwendung 64-Bit ist.

Ich habe Dependency Walker (es gibt 32- und 64-Bit-Versionen, sowie Itanium ...) und Process Monitor , um dies zu debuggen. Die lange und kurze davon ist, stellen Sie sicher, dass jede einzelne DLL, die Ihre DLL einzieht, auch 64-Bit ist, und Sie werden viel glücklicher sein.

Eine Sache, auf die Sie achten sollten, ist, wenn Windows eine 32-Bit-DLL mit dem richtigen Namen findet, wird es versuchen, sie zu laden, und in Process Monitor sieht es so aus, als würde es es erfolgreich lesen. Achte darauf, immer weiter runterscrollen !! Möglicherweise stellen Sie fest, dass das System diese DLL verwirft und weitergeht, um den Pfad für eine 64-Bit-Version zu suchen.

Aktualisierung:
Zwei andere Dinge, auf die man achten sollte:

1) Der alte Dependency Walker kann so aussehen, als würden die DLLs, die er lädt, nicht übereinstimmen. Es könnte zuerst eine 32-Bit-Übereinstimmung finden, wenn Sie wirklich eine 64-Bit-DLL wollten, und Ihnen sagen, dass es CPU-Typ-Mismatches gibt. Holen Sie sich einfach die neue Version, und dieses Problem verschwindet. Vielen Dank an Ссылка für diese Information.

2) Reihenfolge ist wichtig, wenn Sie DLLs laden. Ich wusste nicht, dass ich zwei von ihnen in der falschen Reihenfolge geladen habe und konnte nicht herausfinden, warum es nicht funktionierte. Stellen Sie sicher, dass Sie zuerst die Voraussetzungen laden. : -)

    
kmort 13.04.2015, 15:02
quelle

Tags und Links