Frage

Ich verwalte Projekte für JNI für beide Compiler:MSVC ++ 8.0 und 9.0, meine CPP -Datei enthält die folgende Implementierung:extern "c" {jniexport jlong ​​jnicall java_context_serviceProvidercontext_startserviceProvider (jnienv * env, jclass, jstring jspath) {.....}

Mit Hilfe des Dienstprogramms depend.exe kann ich sehen, dass MSVC 8.0 die erwartete Funktion erfolgreich exportiert: Java_context_ServiceProviderContext_StartServiceProviderAber das Kompilieren unter MSVC 9.0 macht mich verrückt, es exportiert so, als würde externes „C“ überhaupt ignoriert.depend.exe zeigt mir: _Java_context_ServiceProviderContext_StartServiceProvider@12

Weiß jemand genau, was im 9.0-Projekt dieses Verhalten verursacht?

War es hilfreich?

Lösung

JNICALL ist wahrscheinlich #define JNICALL __stdcall.Durch das Ändern der Aufrufkonvention wird die Namensdekoration korrigiert, JNI wird dadurch jedoch schrecklich (auch stillschweigend) beschädigt, da eine Funktion aufgerufen wird __stdcall und etwas anderes bekommen.

Funktioniert es tatsächlich nicht?Nach allem, was ich googeln kann, scheint die JVM zu wissen, wie man die Funktionsnamen richtig dekoriert.

Andere Tipps

Das ist die Aufrufkonvention __stdcall;du brauchst __cdecl.Versuchen Sie vielleicht, __cdecl zur Definition Ihrer Funktion hinzuzufügen?

Alternativ können Sie die Standardaufrufkonvention in den Projekteinstellungen ändern.

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