java编译JNI C++原生代码的X8664 64 WMW WW32
我想编译并运行一个简单的Hello World程序,该程序声明并调用来自Java的本机打印方法(用C++定义)
你好。爪哇
class HelloCPP{
private native void print();
public static void main(String [] args){
new HelloCPP().print();
}
static{
System.loadLibrary("HelloCPP");
}
}
你好。cpp
#include <jni.h>
#include<iostream>
#include "HelloCPP.h"
using namespace std;
extern "C"
JNIEXPORT void JNICALL Java_HelloCPP_print(JNIEnv *env, jobject obj){
cout << "Hello World from C++!" << endl;
return;
}
在命令提示符下,我运行以下命令:
- javac-HelloCPP。爪哇
- javah-jnihellocpp
- 86_64-w64-mingw32-g++-c-I“c:\Java\jdk1.8.0_171\include”-I“c:\Java\jdk1.8.0_171\include\win32”HelloCPP。cpp
- x86_64-w64-mingw32-g++-shared-o HelloCPP。dll HelloCPP。o
- java-Djava。图书馆路径=。你好
然后是臭名昭著的DLL链接/加载错误
Exception in thread "main" java.lang.UnsatisfiedLinkError:<"MyProjectDirectory">\HelloCPP.dll: Can't find dependent libraries at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at HelloCPP.(HelloCPP.java:8)
尝试的解决方案
- java-Djava。图书馆路径=。HelloCPP应该检查当前项目目录,该目录是构建dll的地方,应该链接良好
- 尝试将dll复制到另一个文件夹中,并将该文件夹目录添加到path系统环境变量中
- 使用依赖项步行器并注意到HelloCPP。dll正在寻找libstdc++-6。dll和其他dll
- 尝试将这些驱动程序复制到同一目录中,然后会引发寻找其他DLL的连锁反应
- 尝试添加命令,如-static libstdc++
附加注释
- 我可以用C中的本机方法运行这个程序,并使用x86_64-w64-mingw32-gcc找到、链接、加载DLL,程序运行正常
- x86_64-w64-mingw32-g++通过Cygwin下载
- 切换到x86_64-w64-mingw32-g++是因为我在使用g++时遇到了与Cygwin compilation error Problematic frame: # C [cygwin1.dll+0xd6d47] using JNI相同的问题
- 当前使用高级文本编辑器编写java和C++文件,然后通过命令提示符< /LI>编译
- 如果有人能向我推荐一个好的IDE用于JNI开发,那就太好了
- 第一次发帖希望没有错过任何重要的东西,已经花了很多时间浏览已经提出的问题
# 1 楼答案
Java代码: 你好世界爪哇
cpp代码: 你好cpp
命令