2016-04-25 3 views
1

Я пытаюсь написать набор вызовов JNI для использования некоторого кода на C++ в моем проекте java. Когда я пишу его как код C и компилирую с помощью GCC, это кажется прекрасным, и имена функций верны (Java_myPackage_MyClass_myFunction).G ++ скомпилированная DLL имеет разные имена функций

Но мне легче делать то, что я хочу в C++ вместо C. Когда я пытаюсь скомпилировать код, который у меня есть с C++, файлы заголовков для всех, что я вижу, верны, все выглядит хорошо, но когда я скомпилировать его, длл порождена г ++ вызывает эту ошибку в моем Java код:

Exception in thread "main" java.lang.UnsatisfiedLinkError: package.class.function(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
at package.class.function(Native Method) 

когда я проверяю DLL в зависимости ходунки, функция имеет неправильное имя для него, это было изменено на _Z52Java_package_class_functionP7JNIENV_P8_jobjectP8_jstringS4_

, когда я думаю, что он должен просто появляться в ходу зависимости, как Java_package_class_function

Это команда, я использую для компиляции DLL с г ++

g++.exe -Wl,--add-stdcall-alias -I "C:\Program Files\Java\jdk1.8.0_73\include" -I "C:\Program Files\Java\jdk1.8.0_73\include\win32" -shared -o C:/repos/myproject.dll myproject.cpp -lssl -lcrypto 

Есть ли что-то я пропускаю в компиляции? У меня есть функции в моем .h файле, указанном как JNExport, и завернутый в extern «C» {}. Я просто не совсем понимаю, почему функции именования/звонки меняются при компиляции.

Среда - это компиляция G ++ в Cygwin на Win7 с JDK 1.8 для Java.

функция деклараций в моем файле .h:

extern "C" { 
JNIEXPORT jstring JNICALL Java_package_class_function(JNIEnv *, jclass, jstring, jstring); 

JNIEXPORT jstring JNICALL Java_package_class_function(JNIEnv *, jclass, jstring, jstring); 


char * aes_encrypt_string(char *, char *, char *); 
char * aes_decrypt_string(char *, char *, char *); 

} 

У меня есть externc там, а функции AES обрабатываются корректно экспортируются в DLL-файл, но остальные 2 функции получают дополнительное украшение ,

ответ

0

В компиляторах C++ используется определение имени для создания уникальных записей в таблице символов. Это не нужно в коде C, так как каждая функция должна быть уже уникальной. Чтобы предотвратить изменение имени, оберните определения функций в extern "C" { }

Для получения дополнительной информации см. in-c-source-what-is-the-effect-of-extern-c и a duplicate of your question.

+0

У меня есть декларации в файле .h, завернутые в extern c. Я добавлю суть моего файла .h к вопросу выше – jspriggs

Смежные вопросы