有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    Java代码: 你好世界爪哇

    class helloworld{
        public native void hello();
    
        static {
                System.loadLibrary("hello");
        }
        public static void main(String args[]){
                new Helloworld().hello();
        }
    }
    

    cpp代码: 你好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