在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError

Posted

技术标签:

【中文标题】在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError【英文标题】:calling c++ function from Java using swig in Windows, getting java.lang.UnsatisfiedLinkError 【发布时间】:2015-02-04 07:00:33 【问题描述】:

我有这个 c++ 代码:

/* File : example.cpp */
#include <iostream>
#include <time.h>

double My_variable = 3.0;

int fact(int n) 
if (n <= 1) return 1;
else return n*fact(n-1);


int my_mod(int x, int y) 
return (x%y);


char *get_time()

time_t ltime;
time(&ltime);
return ctime(&ltime);
          

我有这个 .i 代码:

/* example.i */
%module example
%
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%

extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

我正在尝试从 java 内部调用这些函数。所以在 windows 7 (with mingw) cmd 我做:

swig -c++ -java example.i
g++ -c example.cpp example_wrap.cxx -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include" -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include\win32"
g++ -shared example.o example_wrap.o -o example.dll -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include" -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include\win32"

这将创建一个 dll 文件。现在我尝试运行以下 java 程序:

public class main 
   public static void main(String argv[]) 
     System.loadLibrary("example");
     System.out.println(example.fact(5));
     System.out.println(example.get_time());
   
 

所以我跑了

javac main.java

它编译得很好,但是当我使用

运行时
java main

我收到此错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError:     exampleJNI.fact(I)I
        at exampleJNI.fact(Native Method)
        at example.fact(example.java:20)
        at main.main(main.java:4)

有什么问题?

【问题讨论】:

您需要使用 -Djava.library.path= 调用 java。见:examples.javacodegeeks.com/java-basics/… 嗨。感谢您的回复,但它不起作用。我犯了同样的错误。实际上java找到并加载了dll,但我不知道在那之后出了什么问题。如果 java 找不到 dll,它会给我这样的东西:“线程“主”java.lang.UnsatisfiedLinkError 中的异常:java.lang.ClassLoader.loadLibrary 的 java.li brary.path 中没有示例(未知来源) 在 java.lang.Runtime.loadLibrary0(Unknown Source) 在 java.lang.System.loadLibrary(Unknown Source) 在 main.main(main.java:3) " 另一个选项是你的 DLL 找不到它所依赖的东西.... checkout 依赖于 2.2 for windows。它会告诉你是否找不到某些依赖项。 看起来您调用loadLibrary 工作正常,编译器调用看起来不错(原则上)。我怀疑问题出在 C++ 编译器上 - 如果您执行纯 C 实现并调用 gcc 而不是 g++,它会起作用吗? 实际上看起来是链接器错误,请参阅mingw.org/node/41 但基本上您可能需要在链接时将-Wl,--kill-at 添加到命令行。 (如果可行,我会写下来并解释为正确的答案) 【参考方案1】:

使用解决的问题

-Wl,--kill-at

感谢 cmets。

【讨论】:

以上是关于在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章

用Swig将c/c++程序转为java代码(使用swig实现java调用cc++的方法)

如何使用 SWIG 从 C++ 调用 Java?

SWIG (Java):如何将带有回调函数的结构从 Android 应用程序传递给 C++?

如何定义 swig 类型映射以将 unsigned char* 返回到 java

CMake - SWIG - 移植动态库

SWIG:对 Java 的 wchar_t 支持