Java-приложение может загрузить библиотеку, но не может найти функцию (визуальное искажение имени в c ++?) - PullRequest
1 голос
/ 29 октября 2010

Я впервые использую JNI. Мне нужно вызвать стороннюю библиотеку Visual C ++ из Java-программы, поэтому я написал оболочку для Visual C ++. Библиотека загружается нормально, но когда я пытаюсь вызвать функцию из моей библиотеки-оболочки, я получаю страшный UnsatisfiedLinkError.

Моя оболочка включает в себя файл .h, созданный javah, и содержит следующие данные в файле .cpp:

JNIEXPORT jboolean JNICALL Java_Foo_bar (...)

но библиотека показывает (в PE Explorer) _Java_Foo_bar @ 32

и мой код Java имеет

публичный родной логический бар (...) внутри класса Foo

Я подозреваю, что @ 32 - это то, что запутывает Java, но я не могу понять, как от него избавиться. Я не очень разбираюсь в настройках компилятора / компоновщика и тому подобном - по большей части мне удавалось обходиться настройками по умолчанию или кто-то еще занимался этой частью проекта.

Заранее спасибо за любую помощь!

1 Ответ

3 голосов
/ 29 октября 2010

Попробуйте экспортировать свою функцию C ++ как функцию C :

extern "C" JNIEXPORT jboolean JNICALL Java_Foo_bar (...)

Это отключает искажение имени.

Редактировать : это действительно не калечит, а "украшает", что, очевидно, всегда делается для соглашения __stdcall, которое использует JNI. Добавление файла .def или аргумента компоновщика /export представляется решением .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...