我正在尝试创建一个可从 Java 调用的 C 动态库。我在下面编译了一个DLLCygwin http://www.cygwin.com/, using SWIG http://www.swig.org/Doc1.3/Java.html#compiling_dynamic使用以下 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 中正确导出,并放置在实用程序.dll同时:
- C:\Program Files\Java\jdk1.6.0_25\bin
- C:\Program Files\Java\jdk1.6.0_25\jre\bin
I use System.load(libraryPath)
从路径加载1.上面,库文件名包含在路径中,并捕获任何SecurityException
or 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)
I found SWIG 文档的这一部分 http://www.swig.org/Doc1.3/Java.html#using_own_jni_functions,其中说:
packageName 和 moduleName 必须为
当然是正确的,否则你会得到
JVM 动态链接器错误
加载 JNI 函数。
看完之后utilities_wrap.c
,我看到生成的 JNI 方法定义不包含包名称。为了解决这个问题,我添加了 SWIG-package 命令行选项 http://www.swig.org/Doc1.3/Java.html#java_commandline到我的 makefile 的第一行:
swig.exe -java -package invokeoncomport utilities.i
我的 JNI 方法定义现在如下所示,并且我的链接错误已修复!
SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)