使用x86_64-w64-mingw32-g ++编译JNI C ++本机代码 [英] Compiling JNI C++ Native Code with x86_64-w64-mingw32-g++

查看:773
本文介绍了使用x86_64-w64-mingw32-g ++编译JNI C ++本机代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编译并运行一个简单的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 ++之类的命令

附加说明

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆