UnsatisfiedLinkError调用由SWIG生成的JNI吗?

Rob*_*Rob 2 c java dll java-native-interface swig

我正在尝试创建一个可从Java调用的C动态库。我已经在Cygwin下编译了一个DLL ,使用SWIG生成带有以下makefile的JNI:

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
Run Code Online (Sandbox Code Playgroud)

以下是SWIG接口文件的内容utilities.i

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

extern int get_3711a_fd(char * device);
/* Other prototypes omitted for brevity */
Run Code Online (Sandbox Code Playgroud)

我已经验证了这些方法已从DLL中正确导出,并且将Utility.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以上,与包含在路径中的库文件名,并捕获任何SecurityExceptionUnsatisfiedLinkError对这一呼吁。

该库的加载没有任何异常,但是调用该库失败并显示以下内容:

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)
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 5

在SWIG文档的这一部分中找到了内容

当然,packageName和moduleName必须正确,否则当JVM动态加载JNI函数时,您将得到链接器错误。

看完之后utilities_wrap.c,我看到我生成的JNI方法定义不包含程序包名称。为了解决这个问题,我在makefile的第一行中添加了SWIG -package命令行选项

swig.exe -java -package invokeoncomport utilities.i
Run Code Online (Sandbox Code Playgroud)

现在,我的JNI方法定义如下所示,并且我的链接错误已修复!

SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)
Run Code Online (Sandbox Code Playgroud)