在 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(<ime);
return ctime(<ime);
我有这个 .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=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 (Java):如何将带有回调函数的结构从 Android 应用程序传递给 C++?