2023-01-21 235
我正在尝试创建一个可从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接口文件的内容实用程序.i:
/* utilities.i */
%module utilities
%{
#include "driver.h"
%}
extern int get_3711a_fd(char * device);
/* Other prototypes omitted for brevity */
我已经验证了这些方法是否已正确导出从dll导出,并将 utilities.dll 放在两者中:
i使用System.load(libraryPath)从路径上加载 1.
库加载没有任何例外,但是调用库的失败以下内容:
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)
我找到了 Swig文档的这一部分说:
packagename和Modulename必须
当然要正确,否则你会得到
JVM动态时的链接器错误
加载JNI函数.
查看utilities_wrap.c后,我看到了生成的JNI方法定义不包含软件包名称.为了解决此问题,我添加了swig -package command-command-commandline-line选项我的makefile的第一行:
swig.exe -java -package invokeoncomport utilities.i
我的JNI方法定义现在看起来如下,并且我的链接错误已修复!
SWIGEXPORT jint JNICALL Java_invokeoncomport_utilitiesJNI_set_13711a_on(...)
以上所述是小编给大家介绍的调用SWIG生成的JNI出现不满意的LinkError?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26239.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态