UnsatisfiedLinkError вызывает JNI, сгенерированный SWIG? - PullRequest
2 голосов
/ 07 июля 2011

Я пытаюсь создать динамическую библиотеку C, которая будет вызываться из Java. Я скомпилировал DLL под Cygwin , используя SWIG для генерации JNI со следующим make-файлом:

CC= gcc -mno-cygwin
SWIG= /cygdrive/c/Documents\ and\ Settings/student/Desktop/swigwin-2.0.4/swig.exe -java 
INCLUDE1= -I/cygdrive/c/Program\ Files/Java/jdk1.6.0_25/include 
INCLUDE2= -I/cygdrive/c/Program\ Files/Java/jdk1.6.0_25/include/win32

utilities:
    ${SWIG} utilities.i
    ${CC} -c utilities.c utilities_wrap.c ${INCLUDE1} ${INCLUDE2}
    ${CC} -shared utilities.o utilities_wrap.o -Wl,--add-stdcall-alias -o utilities.dll

Вот содержимое файла интерфейса SWIG utilities.i :

/* utilities.i */
%module utilities
%{
#include "driver.h"
%}

extern int get_3711a_fd(char * device);
/* Other prototypes omitted for brevity */

Я проверил, что методы правильно экспортируются из DLL, и поместил utilities.dll в оба:

  1. C: \ Program Files \ Java \ jdk1.6.0_25 \ bin
  2. C: \ Program Files \ Java \ jdk1.6.0_25 \ jre \ bin

Я использую System.load(libraryPath) для загрузки по пути 1. выше, с именем файла библиотеки, включенным в путь, и перехватываю любые SecurityException или UnsatisfiedLinkError при этом вызове.

Библиотека загружается без каких-либо исключений, но при вызове библиотеки происходит следующее:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
invokeoncomport.utilitiesJNI.get_3711a_fd(Ljava/lang/String;)I
    at invokeoncomport.utilitiesJNI.get_3711a_fd(Native Method)
    at invokeoncomport.utilities.get_3711a_fd(utilities.java:14)
    at invokeoncomport.Main.main(Main.java:41)

1 Ответ

5 голосов
/ 07 июля 2011

Я нашел этот раздел документации SWIG , в котором говорится:

PackageName и moduleName должны Конечно, будь прав, иначе ты получишь ошибки компоновщика при динамической JVM загружает функцию JNI.

После просмотра utilities_wrap.c я обнаружил, что мои сгенерированные определения метода JNI не содержат имени пакета. Чтобы это исправить, я добавил параметр командной строки SWIG -package в первую строку моего make-файла:

swig.exe -java -package invokeoncomport utilities.i

Мои определения методов JNI теперь выглядят следующим образом, и моя ошибка компоновки исправлена!

SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)
...