Я пытаюсь написать набор вызовов 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 функции получают дополнительное украшение ,
У меня есть декларации в файле .h, завернутые в extern c. Я добавлю суть моего файла .h к вопросу выше – jspriggs