调用c++;在Windows中使用swig从Java获取函数,获取Java.lang.UnsatifiedLinkError 我有这个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); }

调用c++;在Windows中使用swig从Java获取函数,获取Java.lang.UnsatifiedLinkError 我有这个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); },java,c++,windows,java-native-interface,swig,Java,C++,Windows,Java Native Interface,Swig,我试图从java内部调用这些函数。因此,在windows 7(使用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 exampl

我试图从java内部调用这些函数。因此,在windows 7(使用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)

问题是什么?

使用解决问题

-Wl,--kill-at

感谢您的评论。

您需要使用-Djava.library.path=调用java。看:嗨。谢谢你的回复,但不是那样的。我也犯了同样的错误。实际上java找到并加载了dll,但我不知道在那之后会出现什么问题。如果java找不到dll,它会给我这样的信息:“线程“main”java.lang.UnsatifiedLinkError中的异常:java.lang.ClassLoader.loadLibrary中的java.li brary.path中没有示例,java.lang.Runtime中的loadLibrary(未知源代码)中的java.lang.Runtime.loadLibrary0(未知源代码)中的loadLibrary(未知源代码)在main.main(main.java:3)“另一个选项是您的DLL找不到它所依赖的东西。。。。签出依赖于windows 2.2。如果没有找到依赖项,它会告诉您。看起来您调用
loadLibrary
工作正常,并且编译器调用看起来很好(原则上)。我怀疑这个问题来自C++编译器——如果你做纯C实现,调用GCC而不是G++,它是否工作?实际上看起来它是链接错误,但是,基本上你可能需要在代码链接时添加<代码> -WL,在命令行中杀死/<代码>。(如果可行,我会把它写下来并解释为一个正确的答案)
-Wl,--kill-at