extern "C" не действует в msvc ++ 9.0 - PullRequest
3 голосов
/ 17 марта 2010

Я управляю проектом для JNI для обоих компиляторов: MSVC ++ 8.0 и 9.0, мой файл cpp содержит следующую реализацию: extern "C" {JNIEXPORT jlong ​​JNICALL Java_context_ServiceProviderContext_StartServiceProvider (JNIEnv * env, jclass, jstring jspath)

С помощью утилиты depen.exe я вижу, что MSVC 8.0 успешно экспортирует функцию, как и ожидалось: Java_context_ServiceProviderContext_StartServiceProvider Но компиляция под MSVC 9.0 сводит меня с ума, она экспортируется, игнорируя extern "C"совсем.Отображение мне зависит от файла: _Java_context_ServiceProviderContext_StartServiceProvider @ 12

Кто-нибудь знает, что именно в проекте 9.0 вызывает такое поведение?

Ответы [ 2 ]

1 голос
/ 17 марта 2010

JNICALL, вероятно, #define JNICALL __stdcall. Изменение соглашения о вызовах исправит оформление имени, но это ужасно (в том числе и тихо) нарушит JNI, так как будет вызывать функцию, принимающую __stdcall и получающую что-то другое.

Это на самом деле не работает? Из того, что я могу гуглить, кажется, что JVM знает, как правильно декорировать имена функций.

0 голосов
/ 17 марта 2010

Это __stdcall соглашение о вызовах; вам нужно __cdecl. Может быть, попробуйте добавить __cdecl к определению вашей функции?

Либо измените соглашение о вызовах по умолчанию в настройках проекта.

...