Java 调用SWIG生成的JNI时发生不满意的链接错误?

Java 调用SWIG生成的JNI时发生不满意的链接错误?,java,c,dll,java-native-interface,swig,Java,C,Dll,Java Native Interface,Swig,我正在尝试创建一个可以从Java调用的C动态库。我已在下编译了一个DLL,使用生成带有以下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/cygd

我正在尝试创建一个可以从Java调用的C动态库。我已在下编译了一个DLL,使用生成带有以下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接口文件实用程序的内容。i

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

extern int get_3711a_fd(char * device);
/* Other prototypes omitted for brevity */
我已验证这些方法是否正确地从DLL导出,并将utilities.DLL放置在以下两个位置:

  • C:\ProgramFiles\Java\jdk1.6.0\U 25\bin
  • C:\ProgramFiles\Java\jdk1.6.0\U 25\jre\bin
  • 我使用
    System.load(libraryPath)
    从上面的路径1.加载库文件名,并捕获该调用中的任何
    SecurityException
    unsatifiedlinkerror

    库加载时没有任何异常,但调用库失败,原因如下:

    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)
    
    我发现,上面写着:

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

    在查看了
    utilities\u wrap.c
    之后,我发现生成的JNI方法定义没有包含包名。为了解决这个问题,我将SWIG添加到makefile的第一行:

    swig.exe -java -package invokeoncomport utilities.i
    
    我的JNI方法定义如下所示,我的链接错误已经修复

    SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)
    

    utilities_wrap.c是SWIG生成的包装代码吗?是的,它似乎有必要的导出;例如,
    SWIGEXPORT jint JNICALL Java\u实用程序jni\u get\u 13711a\u 1fd(…)