Опция компилятора MinGW Wl, - kill-at не работает - PullRequest
2 голосов
/ 31 января 2011

В настоящее время я пытаюсь скомпилировать Dll для использования JNI, используя Eclipse CDT и MinGW.

Следуя инструкции, я создал класс Java, который объявляет нативные методы, а затем использовал javah для получения соответствующего заголовочного файлаи я реализовал его в классе C ++.

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

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I
    at Main.integerMethod(Native Method)
    at Main.main(Main.java:12)

Я «исследовал» dll и обнаружил, что все методы, которые должны быть вызваны, имеют суффикс типа «@ 14».Проблема в том, что я уже использую опцию -Wl, - kill-at compiler, которая должна удалить эти очень смущающие теги ... Так почему он не работает?

Журнал компиляции выглядит следующим образом:

**** Rebuild of configuration DLL for project JniCTest ****

**** Internal Builder is used for build               ****
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
Build complete for project JniCTest
Time consumed: 375  ms.  

Что-то не так с опциями компилятора?Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 31 января 2011

Решение найдено. Опция --kill-at не была введена в правильную команду. Действительно, MinGW сначала компилирует файлы в объектный файл .o, затем (вторая строка) выполняет связывание из этого файла .o. Поэтому параметр должен быть помещен во вторую строку.

Исправлены команды для исходного файла Main.cpp и выходной DLL libJniCTest.dll:

g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
0 голосов
/ 08 октября 2012

Я следовал этому простому учебнику JNI на сайте IBM и скомпилировал данный файл Sample1.c с помощью следующей команды на Windows XP .Это нормально работает для меня.

gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"

PS: измените путь JDK в соответствии с вашей системой.

0 голосов
/ 01 октября 2011

Кроме того, не забудьте обернуть свою реализацию следующим образом

extern "C" {

//implemented methods

}

Мне потребовались часы, чтобы выяснить

...