【问题标题】:java c++ jni unsatisfied link errorjava c++ jni不满意的链接错误
【发布时间】:2013-06-20 06:20:23
【问题描述】:

我是 Java JNI 的新手。我尝试了一个 helloCPP 程序,但遇到了问题。这是我的代码:

helloCPP.java;

public class helloCPP { 
    public native void hellocpp ();
    static { 
         System.loadLibrary("helloCPP");
     } 
    public static void main (String [] args) { 
         helloCPP hcpp=new helloCPP (); 
         hcpp.hellocpp (); 

         System.exit (0); 
     }
 }

然后这是我的 hellocpp.cpp ,我用它制作了 helloCPP.dll ;

#include <iostream> 
#include "helloCPP.h"
using namespace std ; 
JNIEXPORT void JNICALL Java_helloCPP_hellocpp.  (JNIEnv *env, jobject obj) {
 cout <<"hello java, I'm c++\n";
}
int main (){};

我成功构建了 helloCPP.dll。但是当我尝试运行 java helloCPP 时,我得到了这个错误:

Exception in thread "main"
java.lang.UnsatisfiedLinkError: helloCPP.hellocpp () V
at helloCPP.hellocpp(Native Method) 
at helloCPP.main (helloCPP.java :8)

我在 Windows 8 x86 操作系统上做所有这些事情。 这些是我写的命令:

javac helloCPP.java 
javah helloCPP 
g++ -c hellocpp.cpp 
g++ -o helloCPP.dll hellocpp.cpp

这个产生了错误:

java HelloCPP 

提前致谢。

【问题讨论】:

  • 在 DLL 中不需要 main(),但需要编译器和链接器开关来指定生成共享库。

标签: java c++ java-native-interface


【解决方案1】:

很可能,Java 运行时找不到 DLL 文件。您已经使用附加参数运行了 Java 应用程序(假设 DLL 文件位于当前目录中):

java -Djava.library.path=. HelloCPP

更新:

EJP 有一个很好的观点。我认为您的链接命令不正确。第二个 g++ 命令应该是这样的:

g++ -o helloCPP.dll -shared hellocpp.o

有两个变化:hellocpp.o 代替 hellocpp.cpp,更重要的是选项 -shared 表示您要创建共享库而不是可执行文件。

具体选项取决于您的平台。由于你没有具体说明,我不能肯定地告诉你。

【讨论】:

  • 我尝试在我的 cmd.exe 上运行该命令,但仍然收到相同的错误消息:
  • 没有。异常告诉你问题在于在 DLL 中查找方法,该方法已加载。
  • 感谢您的帮助。但是我已经尝试按照您上面的建议运行 g++ 命令来创建共享库,但我仍然收到相同的错误消息。肯定加载了dll,但找不到本机方法。我需要做什么?请各位...
  • 您需要准确地告诉我们您在哪个平台上。然后我们可以帮助您正确获取编译和链接命令。我们可以帮助您调试问题。
  • 我使用的是 Windows 8 pro x86。我使用 Visual c++ 构建了 .dll 文件,它神奇地工作了。我认为问题在于我们应该如何创建一个“真实的”.dll 文件,而不仅仅是一些带有 .dll 扩展名的假库。所以我想这会让我们转向另一个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2014-03-26
相关资源
最近更新 更多