【发布时间】: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=
调用 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添加到命令行。 (如果可行,我会写下来并解释为正确的答案)
标签: java c++ windows java-native-interface swig