2009-05-10 8 views
3

Ich muss einige statische Windows-Bibliothek (*.lib) aus Java-Code, ich kann C++ JNI-Wrapper schreiben, aber ich würde es nicht tun (nicht das in C++ erfahren).Verwenden Sie Windows statische Bibliotheken aus Java-Code mit minimalem Aufwand (vorzugsweise mit JNA)

Was wäre der einfachste (geringste Entwicklungsaufwand) Weg es zu benutzen, Leistung ist nicht wichtig, da dieser Code wird nur einige Daten holen, die am ehesten auf JAVA-Seite gearbeitet wird.

Höchstwahrscheinlich würde ich JNA verwenden, aber AFAIK benötigt dynamische Bibliotheken, und ich habe statische.

Ich auch asked questio n auf statische Bibliotheken zu dynamischen konvertieren.

Antwort

2

Für was es wert ist, hatte ich ein Projekt wie dieses eine Weile zurück. Es war ziemlich einfach, die JNI-Wrapper automatisch zu generieren. Ich denke, wir hatten rund 350 Funktionsexporte zu wickeln. Es hat ungefähr 3 Stunden gedauert, ein Skript zusammenzustellen, um den Wrapper automatisch zu generieren (sorry, das Skript ist nicht griffbereit oder ich poste es).

Wir haben fast selbst keinen C++ Code geschrieben - aber es musste verstanden werden, wie JNI funktioniert ... Das ist eigentlich eine ziemlich gute Lernmöglichkeit/Projekt - wenn Sie Zeit haben, haben Sie keine Angst vor JNI - werden Sie Seien Sie erstaunt, wie viel Sie darüber lernen, wie die JVM funktioniert ...

Wenn Sie diese Route gehen, empfehle ich, dass Sie Ihre Wrapper-Funktionen wirklich, wirklich leicht - buchstäblich keine Verarbeitung in ihnen überhaupt. Transformieren Sie einfach die notwendigen Argumente von JNI-Werten in native (dies wird hauptsächlich für Strings benötigt), rufen Sie Ihre native Funktion auf und transformieren Sie die Ergebnisse zurück.

Wenn Sie eine Funktion haben, die einen Zeichenfolgenzeiger übergibt und erwartet, dass die Zeichenfolge im Zeiger zurückkommt, verwenden Sie ein Zeichenfolgenarray mit der Größe 1 von der Java-Seite und füllen Sie sie mit dem Ergebnis des systemeigenen Aufrufs.

Oder wenn Sie für die Zeit gedrückt werden, kompilieren Ihre LIB eines .dll und JNA verwenden :-)

3

Sie können immer ein DLL-Projekt (dynamische Bibliothek) erstellen, das direkt in Ihre statische Bibliothek aufruft, und dann können Sie JNA mit der neu erstellten DLL verwenden.

+1

Ja ich konnte, aber ich würde sehr viel lieber das ganze Zeug directrly von Java-Aufruf. . . Es würde mir erlauben, schneller zu experimentieren. Die Bibliothek, die ich benutze, ist eine Unordnung, die Hunderte von Funktionen hat, so dass das Schreiben eines vollständigen Wrappers keine Option ist, und es nach und nach zu tun, wird auch ein Schmerz sein. –

+1

Ich schlage nicht die JNI vor, es gibt also keine Notwendigkeit, komplexe Dinge in Wrapper zu schreiben. In der Tat ist es einfach - Präfix _declspec (dllexport) zu jeder Funktion in der Kopfzeile (die einfach durch Search-Replace-Editor erfolgen kann) und als DLL-Projekt erstellen, dann sollte es Ihnen eine DLL geben. – Francis

+0

Ich werde es versuchen, danke. –