Ich benutze JNI, um ein paar native Funktionen in einer geschlossenen Quelle PDF library zu wickeln. Es hat ein abhängiges Verzeichnis fonts
, das sich in einem Unterordner des aufrufenden Anwendungsverzeichnisses befinden muss. Nach meiner Erfahrung ist es Standard, basierend auf dem aktuellen Arbeitsverzeichnis zu suchen. Also, das Problem.JNI-umhüllte Bibliothek sucht falsches Arbeitsverzeichnis - wie umgehen?
Wenn der JNI-Code in eine Java-Anwendung geladen wird, ist das aktuelle Arbeitsverzeichnis korrekt. Das aufrufende Anwendungsverzeichnis ist java.exe
's Bin-Verzeichnis. Ich habe überprüft, dass das Ablegen des abhängigen fonts
Ordners in C:\Program Files (x86)\Java\jre6\bin
Ordner wie erwartet funktioniert.
Die Bibliothek scheint einen C++ GetCommandLine()
Aufruf oder etwas Ähnliches zu verwenden, um zu bestimmen, wo das Schriftartenverzeichnis sein sollte. Offensichtlich ist dies eine inakzeptable Lösung.
Ich möchte vermeiden, eine externe EXE aufrufen. Aber die einzigen Problemumgehungen, die ich habe kommen mit sind:
- Kompilieren eine EXE-Datei, in Java-Projektverzeichnis, und verwenden Java
Runtime.exec()
auszuführen. (Dies tut Arbeit) - Make Start JNI Code ein separater Prozess, der das gleiche tut wie oben (Gewinne nichts anderes als mehr Komplexität)
Alle Ideen, wie ich dieses Problem umgehen kann? Wenn Java-Anwendungen als ausführbare JAR kompiliert werden, ist die resultierende Befehlszeile immer noch die C:\Program Files\...java.exe
?
Ich konnte GetCommandLine() nicht den vollständigen Pfad zurückgeben, so dass ich es nicht testen konnte, aber haben Sie versucht, eine symbolische Verbindung zu java.exe im richtigen Verzeichnis herzustellen und verwenden Sie es, um Ihr Programm zu starten? –