2010-12-16 6 views
1

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?

+0

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? –

Antwort

2

Ein ausführbarer Java-Maker kann aus Ihrer Java-Anwendung eine ausführbare * .exe-Datei erstellen, ohne native Codierung oder Kompilierung. Sie können diese ausführbare Datei, die JAR-Dateien, die Schriftarten und andere Anwendungsabhängigkeiten in einem einzigen Installationsverzeichnis ablegen.

Exe4j ist einer der ausführbaren Hersteller, die dies für Windows unterstützen. Es erfordert keine Annahmen über das aktuelle Arbeitsverzeichnis. Dies ist wichtig in dem häufigen Fall, in dem Sie keine Kontrolle über das Arbeitsverzeichnis haben, wenn die Anwendung gestartet wird.

+0

Das klingt nach praktikabler Lösung; Markierung als akzeptiert. Ich habe ein paar Open-Source-Alternativen gefunden, die auch EXEs erzeugen. Angesichts der zusätzlichen (nicht verwandten) Abhängigkeiten, die dieses Projekt haben wird, werde ich "Runtime.exec" vorläufig verwenden. Dieser Link zum Extrahieren einer EXE aus einer JAR zur Laufzeit kann eine nützliche Referenz sein - http://stackoverflow.com/questions/600146/run-exe-which-is-packaged-inside-jar –