调用SWIG生成的JNI出现不满意的LinkError?

 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:

调用SWIG生成的JNI出现不满意的LinkError?

/* 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文件\ java \ jdk1.6.0_25 \ bin
  2. c:\ program文件\ java \ jdk1.6.0_25 \ jre \ bin

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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。