JNI mit Microsoft Visual StudioNovember 2014
Seit 2005 gibt es kostenlose Versionen von Microsoft Visual Studio (MVS), die
Express Editions,
die sich auch gut für die JNI Entwicklung eignen.
Hier finden sich einige nützliche Einstellungen für den Java-Programmierer, der kaum C/C++-Erfahrung hat.
Einstellungen
/sdl
(Enable Additional Security Checks) abstellen und evtl. Auch
vorkompilierte Header
abstellen.
Includes
Aus dem JVM-Verzeichnis die Unterverzeichnisse
include
,
include/win32
und
include/win32/bridge
in
Eigenschaften > C++ > Zusätzliche Includeverzeichnisse
angeben.
Vorher sicherstellen, dass die aktive Konfiguration bearbeitet wird (peinliche Dinge können sonst passieren).
Wenn es gar nicht klappt mit den includes, die Verzeichnisse kopieren ins MVS Verzeichnis, z.B. nach
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
.
Unicode-Probleme
Fehlermeldungen der Art "
Das Argument vom Typ ""const char *"" ist mit dem Parameter vom Typ ""LPCWSTR"" inkompatibel.
" werden durch den Unterschied Unicode vs. Nicht-Unicode Codierung verursacht.
Lösungen:
- Zeichensatz auf "
Multibyte-Zeichensatz verwenden
" umstellen in Allgemein.
- Ist dies nicht möglich, für Systemaufrufe die nicht-Unicode Variante wählen (endet mit A), z.B.
LoadLibraryA
anstelle von LoadLibrary
.
- Oder den String mit
L"
statt nur mit "
beginnen.
Lösung der Wahl ist aber das Umstellen auf Multibyte-Zeichensatz in den Optionen.
Aufrufkonventionen
Wenn bei Aufrufen von Befehlen aus einer externen Bibliothek beim Ausführen eine Fehlermeldung
der Art "
the value of ESP was not properly saved...
" erscheint so wird eine falsche Aufrufkonvention
verwendet. Dadurch ist der Stackpointer (ESP) nach dem Funktionsaufruf an einer anderen Stelle als vorher.
Um dies zu Ändern, kann im typedef die Konvention (
WINAPI
oder
CALLBACK
) angegeben werden,
z.B.
typedef int(WINAPI*createvm)(JavaVM**, void**, JavaVMInitArgs*);
Weitere Erklärungen
auf StackOverflow.
Konsole und nicht-Konsole
Möglicherweise sollen Programme als Konsolenanwendung und als Anwendung ohne Konsole verfügbar sein, abhänging von der ausgewählten
Konfiguration.
Unter MVS ist dies dadurch möglich, dass mit einer Konsolenanwendung begonnen wird.
Um die Konsole zu entfernen dann in den Einstellungen unter "
Linker > System > Subsystem
"
Windows
einstellen statt
Console
. Als zusätzlichen Parameter für den Linker dann
/entry:mainCRTStartup
eingeben.
Dadurch wird anstatt der für Windows-Anwendungen üblichen Funktion
WinMain
die Funktion
mainCRTStartup
als Einstiegspunkt verwendet, die etwas später das
main
des Programms aufruft.
verlinkte DLLs
Wenn es Fehlermeldungen bzgl. runtime-DLLs gibt, z.B. Fehlen von msvcr120.dll oder msvcp120.dll kann dies auf zwei Arten gelöst werden:
-
Die Dateien aus dem "Visual C++ Redistributable" von Microsoft verwenden. Das Redistributable installieren und die benötigten Dateien aus einem
Unterverzeichnis von
C:\Windows
ins Programmverzeichnis kopieren.
-
Den Runtime-Code ins Programm linken, mit der Option
/MT
(statt /MD
) in den Einstellungen unter
"C/C++ > Codegenerierung > Laufzeitbibliothek
".
Weitere Erklärungen
auf StackOverflow.