调用SWIG生成的JNI的UnsatisfiedLinkError?

时间:2011-07-07 16:01:05

标签: java c 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

以下是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
  3. 我使用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)
    

1 个答案:

答案 0 :(得分:4)

我找到了this section of the SWIG documentation,其中说:

  

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

在查看utilities_wrap.c之后,我看到生成的JNI方法定义不包含包名。为了解决这个问题,我将SWIG -package command-line option添加到了makefile的第一行:

swig.exe -java -package invokeoncomport utilities.i

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

SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)