使用x86_64-w64-mingw32-g ++编译JNI C ++本机代码 [英] Compiling JNI C++ Native Code with x86_64-w64-mingw32-g++
问题描述
我想编译并运行一个简单的Hello World程序,该程序从Java声明并调用本机打印方法(用C ++定义).
I want to compile and run a simple Hello World program that declares and calls a native print method (defined in C++) from Java.
HelloCPP.java
HelloCPP.java
class HelloCPP{
private native void print();
public static void main(String [] args){
new HelloCPP().print();
}
static{
System.loadLibrary("HelloCPP");
}
}
HelloCPP.cpp
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.java
- javah -jni HelloCPP
- 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.library.path =. HelloCPP
然后臭名昭著的DLL链接/加载错误
线程"main"中的异常java.lang.UnsatisfiedLinkError:<"MyProjectDirectory"> \ HelloCPP.dll:在java.lang的java.lang.ClassLoader $ NativeLibrary.load(本机方法)处找不到依赖库.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),位于HelloCPP.(HelloCPP.java:8)
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.library.path =. HelloCPP应该检查当前项目目录,该目录是dll的生成目录,并且应该可以正常链接
- 尝试将dll复制到另一个文件夹,并将该文件夹目录添加到路径系统环境变量中
- 使用Dependency Walker,发现HelloCPP.dll正在寻找libstdc ++-6.dll和其他dll
- 试图将这些驱动程序复制到同一目录中,然后导致连锁反应寻找其他dll
- 尝试添加-static-libstdc ++之类的命令
附加说明
- 我可以使用C语言中的本机方法运行确切的程序,并使用x86_64-w64-mingw32-gcc运行该DLL,找到该DLL并将其链接,加载并且程序可以正常运行
- x86_64-w64-mingw32-g ++是通过Cygwin下载的
- 切换到x86_64-w64-mingw32-g ++,因为我遇到的问题与推荐答案
Java代码: helloworld.java
Java Code: helloworld.java
class helloworld{ public native void hello(); static { System.loadLibrary("hello"); } public static void main(String args[]){ new Helloworld().hello(); } }
cpp代码: hello.cpp
cpp code: hello.cpp
#include<iostream> #include "helloworld.h" using namespace std; JNIEXPORT void JNICALL Java_helloworld_hello(JNIEnv *env, jobject obj) { cout<<"Hello World"; return; }
命令
javac -h . helloworld.java g++ -I /usr/lib/jvm/java-8-oracle/include/ -I /usr/lib/jvm/java-8-oracle/include/linux/ hello.cpp -shared -o libhello.so -fPIC java -Djava.library.path=. helloworld
这篇关于使用x86_64-w64-mingw32-g ++编译JNI C ++本机代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!