当前位置: 首页 > 知识库问答 >
问题:

用x86_64编译JNI C原生代码-w64-ming w32-g

阎功
2023-03-14

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

java下载

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

CPP. 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-ming w32-g-c-I"C:\Java\jdk1.8.0_171\include"-I"C:\Java\jdk1.8.0_171\include\win32"HelloCPP. cpp
  • x86_64-w64-ming w32-g-share-o HelloCPP. dll HelloCPP. o
  • java-Djava.library.path=. HelloCPP

然后臭名昭著的DLL链接/加载错误

线程“main”java中出现异常。lang.UnsatifiedLink错误:

尝试的解决方案

  • 爪哇-贾瓦。图书馆路径=。HelloCPP应该检查当前项目目录,该目录是构建dll的地方,应该链接良好
  • 尝试将dll复制到另一个文件夹中,并将该文件夹目录添加到path系统环境变量中
  • 使用依赖项查询器并注意到HelloCPP。dll正在查找libstdc-6。dll和其他dll
  • 试图将这些驱动程序复制到同一个目录中,然后会引发连锁反应,寻找其他DLL
  • 尝试添加命令,如-static libstdc

附加说明

  • 我可以用C语言中的本机方法运行这个确切的程序,并使用x86_64-w64-ming w32-gcc,找到、链接、加载DLL,程序运行良好
  • x86_64-w64-ming w32-g是通过Cygwin下载的
  • 切换到x86_64-w64-ming w32-g,因为我遇到了与Cygwin编译错误相同的问题问题框架:#C[cygwin1.dll0xd6d47]在使用g时使用JNI
  • 目前使用Sublime文本编辑器编写我的Java和C文件,然后通过命令提示符编译
  • 如果有人能推荐我一个好的IDE用于JNI的开发,那就太好了
  • 第一次发帖希望没有错过任何重要的事情,已经花了很多时间通过已经问过的问题

共有1个答案

符鸿光
2023-03-14

Java代码:helloworld。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
 类似资料:
  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 1.1. 代码编译 1.1.1. Openwrt编译 1.1.2. Kernel编译 1.1.3. Uboot编译 1.1.4. VSP编译 1.1. 代码编译 1.1.1. Openwrt编译 作为Kamino18 YODAOS的整体编译环境,使用openwrt可以编译出系统正常运行所需的主要image如下: 镜像名字 镜像运行位置 镜像说明 镜像生成位置 mcu.bin MCU The ima

  • 我还想知道是否会有更直接的方法来编译和运行生成的代码。

  • 我的pom文件列表 但是,在时,我得到 当我运行时,我看到实际上我使用的是Java6 它可以在哪里定义?我有源(d)my.zshrc多次。

  • ucore 代码编译 (1) 编译过程:在解压缩后的 ucore 源码包中使用 make 命令即可。例如 lab1中: [email protected]: ~/lab1$ make 在lab1目录下的bin目录中,生成一系列的目标文件: ucore.img:被qemu访问的虚拟硬盘文件 kernel: ELF格式的toy ucore kernel执行文,被嵌入到了ucore.img中

  • 我正在尝试学习java的这个新GWT部分。。。 我做了我的第一个简单的应用程序 我命名了 我的模块:-HelloWorld 我收到以下错误: 2014年4月18日下午4:00:53爪哇。util。首选项。WindowsPreferences警告:无法在根0x8000002处打开/创建prefs根节点Software\JavaSoft\prefs。Windows RegCreateKeyEx(…)返