我想编译并运行一个简单的Hello World程序,该程序从Java声明并调用本机打印方法(在C++中定义)。

HelloCPP.java

class HelloCPP{
    private native void print();
    public static void main(String [] args){
        new HelloCPP().print();
    }
    static{
        System.loadLibrary("HelloCPP");
    }
}

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链接/加载错误



    尝试的解决方案
  • 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++,因为使用g++
  • 时我遇到了与Cygwin compilation error Problematic frame: # C [cygwin1.dll+0xd6d47] using JNI相同的问题
  • 当前使用Sublime文本编辑器编写我的Java和C++文件,然后通过命令提示符
  • 进行编译
  • 如果有人可以推荐我一个很好的IDE来与JNI一起使用,那将是很棒的
  • 希望第一次发布不会错过任何重要事项,花了很多时间来处理已经问过的问题
  • 最佳答案

    Java代码:
    helloworld.java

    class helloworld{
        public native void hello();
    
        static {
                System.loadLibrary("hello");
        }
        public static void main(String args[]){
                new Helloworld().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
    

    07-24 09:46
    查看更多