Frage

Ich bin etwas JNI Code in C ++ zu schreiben, um von einem Applet unter Windows XP aufgerufen werden. Ich habe in der Lage, erfolgreich das Applet laufen und haben die JNI-Bibliothek geladen und rief sogar so weit gehen, wie es funktioniert in anderen DLLs aufrufen zu müssen. Ich habe diese Arbeit durch die Systemumgebungsvariable PATH Einrichtung, um das Verzeichnis sind alle meine DLLs sind in.

Also, das Problem ist, dass ich einen weiteren Anruf hinzufügen, die eine neue externe DLL verwendet, und plötzlich, wenn die Bibliothek geladen wird, wird ein UnsatisfiedLinkError geworfen. Die Botschaft lautet: ‚Die angegebene Prozedur konnte nicht gefunden werden.‘ Dies scheint kein Problem mit einem fehlenden abhängigen DLL zu sein, weil ich eine abhängige DLL entfernen und eine andere Meldung über abhängige DLL fehlt bekommen. Von dem, was ich habe online zu finden in der Lage, scheint es, dass diese Meldung bedeutet, dass eine native Java-Funktion Implementierung aus der DLL fehlt, aber es ist seltsam, dass es ohne dieses zusätzliche Stück Code funktioniert gut.

Wer weiß, was dieses verursachen könnte? Welche Dinge können einen geben ‚Die angegebene Prozedur konnte nicht gefunden werden‘ Nachrichten für ein UnsatisifedLinkError?

War es hilfreich?

Lösung

dachte ich, das Problem. Das war der Hammer. Die Meldung „Die angegebene Prozedur konnte nicht gefunden werden“ für UnsatisfiedLinkError zeigt an, dass eine Funktion in der Root-DLL oder in eine abhängige DLL konnte nicht gefunden werden. Die wahrscheinlichste Ursache dafür in einer JNI Situation ist, dass die native JNI-Funktion nicht korrekt ausgeführt wird. Aber dies kann offenbar geschehen, wenn eine abhängige DLL geladen ist und dass DLL ist eine Funktion von der Mutter erforderlich fehlt.

Als Beispiel haben wir eine Bibliothek input.dll genannt. Die DLL-Suchreihenfolge ist immer zuerst im Anwendungsverzeichnis zu suchen und die PATH-Verzeichnissen zuletzt. In der Vergangenheit liefen wir immer ausführbare Dateien aus dem gleichen Verzeichnis wie input.dll. Es gibt jedoch eine andere input.dll im Windows-Systemverzeichnis (das in der Mitte der DLL-Suchreihenfolge ist). Also, wenn dies von einem Java-Applet ausgeführt wird, wenn ich den Code in dem oben beschriebenen Applet enthalten, die input.dll geladen werden verursacht, lädt es die input.dll aus dem Systemverzeichnis. Da unser Code bestimmte Funktionen in input.dll erwartet, die nicht da sind (weil es eine andere DLL) nicht die Last mit einer Fehlermeldung über fehlende Verfahren. Nicht, weil die JNI-Funktionen falsch exportiert, sondern weil die falsche abhängige DLL geladen wurde und es hat nicht die erwarteten Funktionen in ihm.

Andere Tipps

Es gibt eine Chance, dass die DLL gebaut wurde unter Verwendung von C ++ (im Gegensatz zu C entgegengesetzt). es sei denn, Sie hütete eine extern über das Verfahren zu tun, das ist ein möglicher Grund.

Versuchen Sie, aus der DLL alle Funktionen zu exportieren. Wenn die Liste Ihrer Funktion enthält, dann bist du gut.

In der Regel, wenn sie mit anderen Bibliotheken verknüpfen, müssen Sie auf die entsprechende LIB-Datei verknüpfen. Es klingt wie Sie sind nicht alle lib Dateien verweisen Sie benötigen. Überprüfen Sie, was nicht ist die Verknüpfung und stellen Sie sicher, fügen Sie ihn in der Liste für den Linker lib ist.

Haben erstellen Sie die neue externe DLL den Standard JNI Prozedur? Das heißt, mit javah und so weiter? Wenn ja, dann bin ich nicht sicher, was falsch ist.

Wenn nicht, dann wird die Prozedur Sie versuchen, ist zu rufen nicht exportiert worden (wie durch anjanb erwähnt). Ich bin mir bewusst, Zwei-Wege-Funktionen exportieren: eine separate Exportliste und Kennzeichnung spezifische Funktionen mit __declspec (dllexport)

.

Kann nicht Variable in C ++ zugreifen DLL aus eine C App hat ein wenig mehr Informationen das Thema DLLs.

Stellen Sie sich Ihren c ++ Code im Debug-Modus. Dann legen Sie das Debugbreak (); Anweisung, wo Sie möchten, dass das Debuggen starten. Führen Sie den Java-Code. Wenn die Debugbreak () Anweisung angetroffen wird, wird ein Popup mit einem Debug-Taste auf es. Klick es an. Dev Studio wird mit dem Programm in Maschinencode öffnen. Schritt über mit dem Debugger zweimal und Sie sollen in der Lage sein, Ihren Source-Code.

Wenn Sie alle Programmier Problem bei JNI Handbücher und Beispielen getan haben, aber immer noch sind Sie gleiche fehlende Prozedur Fehler bekommen, Problem kann wahrscheinlich auf Ihrem Weg variabel sein. Führen Sie folgende Schritte aus und läuft wieder:

  1. Achten Sie darauf, über Sie Variable JAVA_HOME auf Ihre JDK-Ordner (nicht JRE weil JRE doesnt jni Header enthalten) gesetzt Beispiel: Bei Einstellungen der Umgebungsvariablen Panel definieren var: JAVA_HOME val: C: \ Programme \ Java \ jdk1.7.0_11
  2. in % JAVA_HOME% \ bin , um Ihre Pfadvariablen

Nachdem diese Schritte tun, können Sie Ihre Anwendung jni Prozedurnamen und Links zu JNI.dll in richtigen Weg finden. Also, ich hoffe, dass Sie nicht wieder diese fehlende Prozedur Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top