g++: как разобрать экспортированные символы

Я пытаюсь скомпилировать библиотеку Java, использующую JNI. Когда я запускаю программу, я вижу сбой с ошибкой UnsatisfiedLinkError, которая говорит о том, что конкретный метод не может быть найден в DLL.

При ближайшем рассмотрении я обнаружил, что g++, который я использую для компиляции и компоновки, искажает имена моих методов, добавляя суффиксы, такие как "@8" или "@16", к именам методов. Кто-нибудь знает правильные параметры компилятора, чтобы отключить изменение имени? Заранее спасибо!

EDIT: я использую MinGW через плагин Eclipse + CDT.


person python dude    schedule 02.01.2010    source источник


Ответы (1)


Чтобы вызовы JNI работали с Windows DLL, скомпилированными с помощью GCC, вам необходимо добавить параметр add-stdcall-alias в GCC на этапе компоновки:

gcc -Wl,--add-stdcall-alias

Что добавит правильные имена функций в DLL и, таким образом, разрешит вызовы через JNI.

person Mavrik    schedule 02.01.2010
comment
Большое спасибо! Это, наконец, решило мою проблему. С этим параметром для каждого метода в DLL есть декорированная и недекорированная версия, и программы на Java работают :D - person python dude; 03.01.2010
comment
@Mavrik, спасибо, что заполнили это, я знал проблему, но не решение. - person bmargulies; 03.01.2010