如何在Java项目中定义并调用自己编写的native方法?

2023-11-10

如何在Java项目中定义并调用C/C++编写的native方法?

开发工具

IntelliJ IDEA 2020 (用来编写java代码
Visual Studio 2019 (用来编写用C++实现的native方法

编写测试的java代码

(1)编写代码: 在src目录下新建一个包Package0,在该包中建一个类HelloCPlus。

package Package0;

public class HelloCPlus {

    //这是在之前代码的基础之上添加的代码,目的是添加.dll文件
    static {
        System.loadLibrary("Dllforjavatest1");
    }

    public native int HelloJava();   //信息
    public native int CPlusMax(int... elements);  //求最大值
    public native int CPlusMin(int... elements);  //求最小值
    public native int CPlusAccumulate(int... elements);  //求累加和


    public static void main(String[] args) {
        HelloCPlus helloCPlus = new HelloCPlus();
        System.out.println("-------");

        helloCPlus.HelloJava();
        int[] apples = {4,5,6,7,1,2,3};
        System.out.println("数组最小值为:"+helloCPlus.CPlusMin(apples));
        System.out.println("数组最大值为:"+helloCPlus.CPlusMax(apples));
        System.out.println("数组的累加和为:"+helloCPlus.CPlusAccumulate(apples));

    }
}

(2)使用命令生成项目头文件,即.h文件。

这里可以有两个步骤:
第一个步骤:

使用“WIN+R”命令输入CMD打开Windows的命令行程序,进入到项目的类目录中,使用命令 javah -classpath E:\Java_learning_project\JNIProgramTest\src -jni Package0.HelloCPlus
即可生成HelloCPlus的.h文件(注:生成的.h文件将会存放在项目的类目录中)

忽略错误
在这里插入图片描述
第二个步骤:

先运行main方法,报错没关系,在IDEA中切换到terminal命令窗口,使用命令:javah -classpath out\production\JNIProgramTest -d ./jni Package0.HelloCPlus,就可以将生成的.h文件置于jni目录中

在这里插入图片描述

编写C++代码

使用 Visual Studio 2019 编写C++实现的native方法。
(1)新建项目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)配置头文件:
找到本地电脑JDK1.8安装路径。将路径下的jni.h和jni_md.h文件复制到C++项目路径下:
在这里插入图片描述
在这里插入图片描述
然后将IDEA创建的头文件Package0_HelloCPlus.h复制到项目路径下:
在这里插入图片描述
最后再将这三个文件添加到Visual Studio创建的项目的头文件中。
在这里插入图片描述
(3)实现C++代码:
首先修改一下Package0_HelloCPlus.h的开头部分:在这里插入图片描述
新建C++源文件HelloJava.cpp:
在这里插入图片描述
在这里插入图片描述
HelloJava.cpp代码实现如下:

#include "Package0_HelloCPlus.h"
#include "jni.h"   //导入两个头文件
#include <iostream>
#include<algorithm>
#include<numeric> //std::accumulate
using namespace std;

//Native调用的方法
/* JNI方法基本格式:JNIEXPORT 返回值类型 JNICALL 方法名(参数列表)
* 方法名规范:Java_包名_类名_方法名
* 参数列表:JNIEnv *env 第一个参数是JNI环境参数,即JNIEnv类型的指针。
*           jobject instance 第二个参数是native方法的Java类对象。
*/
JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_HelloJava
(JNIEnv* env, jobject obj)
{
    cout << "Hello java,The message is from C++!" << endl;
    return 0;
}

JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_CPlusMax
(JNIEnv* env, jobject obj, jintArray jarr)
{
    //获取arrays对象的指针  
    jint* int_arr = env->GetIntArrayElements(jarr, NULL);
    //获取数组的长度  
    jsize len = env->GetArrayLength(jarr);
    return *max_element(int_arr, int_arr + len);
}

JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_CPlusMin
(JNIEnv* env, jobject obj, jintArray jarr)
{
    //获取arrays对象的指针  
    jint* int_arr = env->GetIntArrayElements(jarr, NULL);
    //获取数组的长度  
    jsize len = env->GetArrayLength(jarr);
    return *min_element(int_arr, int_arr + len);
}

JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_CPlusAccumulate
(JNIEnv* env, jobject obj, jintArray jarr)
{
    //获取arrays对象的指针  
    jint* int_arr = env->GetIntArrayElements(jarr, NULL);
    //获取数组的长度  
    jsize len = env->GetArrayLength(jarr);
    return accumulate(int_arr, int_arr + len, 0);  //初始值为0
}

(4)配置管理器,生成.dll动态链接库文件。
在这里插入图片描述
使用快捷键<Ctrl+B>或者点击"生成"——>“生成Dll_for_java_test1”,编译项目。
在这里插入图片描述

将dll文件链接到java项目中

有两种方法。第一种:
直接将把生成的.dll文件放入idea的项目根目录下,执行方法。
在这里插入图片描述

在这里插入图片描述
第二种:
在这里插入图片描述
在VM options中添加.dll文件的路径:-Djava.library.path="D:\Program Files (x86)\VS_2019\C++projects\Dll_for_java_test1\x64\Debug"
在这里插入图片描述
在这里插入图片描述
调试成功。

总结

编写java代码,生成头文件 ——> 引入头文件,编写C++实现代码,生成dll文件 ——> 将dll文件链接到java项目中。

希望这篇文章对你有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Java项目中定义并调用自己编写的native方法? 的相关文章

随机推荐

  • AngularJs的生命周期

    AngularJs的生命周期分为六个阶段 编译 AngularJs会遍历浏览器提供的dom树 尝试参照已注册的指令集来匹配每个元素 属性 注释和css类 每当匹配一个指令时 ag就会调用该指令的编译函数 该函数返回一个连接函数 ag会收集所
  • linux 命令行操作串口

    linux 命令行操作串口 1 获取串口号 2 配置串口属性 stty命令 3 串口数据读写操作 4 解析数据 5 后台运行 6 绘制数据 Linux stty命令 一 参数 二 用法 Linux下minicom操作 Linux minic
  • 算法第六题:压缩字符串 2021-08-21

    一 题目 给你一个字符数组 chars 请使用下述算法压缩 从一个空字符串 s 开始 对于 chars 中的每组 连续重复字符 如果这一组长度为 1 则将字符追加到 s 中 否则 需要向 s 追加字符 后跟这一组的长度 压缩后得到的字符串
  • WPF的MVVM框架Stylet开发文档 14.7-14.9 杂项、性能、技术

    14 7 StyletIoC 杂项 文档地址 此页面包含其他各种值得一提的点点滴滴 但还不够大 不值得单独放置一个页面 循环依赖 循环依赖项 下面记录的类型除外 会导致 StackOverflow 异常 提前发现这些问题并非易事 虽然 St
  • C# 如何将EMF文件转换成PNG文件

    本文主要讲述如何将EMF文件转换成PNG文件 目录 一 EMF文件和PNG文件 二 代码 一 EMF文件和PNG文件 EMF文件和PNG文件都是Windows系统可以读取的图片文件格式 所以转换比较简单 二 代码 有几个地方需要要注意 1
  • Softing D-PDU API 11_30_010 新版本支持TLS

    一 TLS的概述 安全传输层协议 Transport Layer Security 缩写 TLS 前身为安全套接层 Secure Sockets Layer 缩写 SSL 用于在通信应用程序之间提供保密性和数据完整性 该协议由两层组成 一个
  • 质因数分解(唯一分解定理)

    质因数分解 题目描述 多数据 给出t个数 求出它的质因子个数 数据没坑 难度降低 输入描述 Input Description 第一行 t 之后t行 数据 输出描述 t行 分解后结果 质因子个数 样例输入 2 11 6 样例输出 1 2 数
  • vs2010 点击时应用程序无法正常启动(0xc000007b).请单击“确定”关闭应用程序解决办法

    昨天做项目的时候 在安装一个win32的应用程序后再次启动vs2010时发现报错 就是如下的错误 哎呀 我的天 关键时刻就打不开了 这么怎么办呢 赶紧去搜解决办法 1 使用Directx修复 修复了180个左右的dll文件 但是没有解决我的
  • 卷积操作中的卷积核形状到底是怎样的

    input shape 2 5 5 kernal size 2 3 3 kernal amount 3 卷积核的维度与输入的维度一致 都是三维的 最后的输出的通道数与卷积核数量一致 用了三个卷积核 就会输出三个通道
  • IDEA最好用的插件推荐,吐血整理!

    作者 明明如月 来源 慕课专栏 阿里巴巴Java开发手册 1 前言 俗话说 工欲善其事 必先利其器 为了助力大家的学习和进阶 本小节介绍几个对 Java 学习非常有帮助的 IDEA 插件 代码反编译和反汇编工具 以及非常不错的网站等 2 I
  • 【板子】

    线段树 1 include
  • c语言数组处理实验报告心得体会,C语言实验报告总结计划数组.doc

    学 生 实 验 报 告 学院 软件与通信工程学院 课程名称 C 语言与程序设计 专业班级 通信 121 姓名 学号 学生实验报告 4 学生姓名 学号 同组人 实验项目 函数 必修 选修 演示性实验 验证性实验 操作性实验 综合性实验 实验地
  • 海量数据存储方案

    参考原文 http blog csdn net xlgen157387 article details 53230138 一 网站应用背景 开发一个网站的应用程序 当用户规模比较小的时候 使用简单的 一台应用服务器 一台数据库服务器 一台文
  • 使用ffmpeg将图片将图片合成视频或者取视频帧作为视频封面

    首先需要下载ffmpeg exe将exe文件放入资金的程序bin目录 然后通过命令行的方式调用ffmpeg是完成想要做的事情 这里举两个最简单的例子 将图片合成视频或者取视频帧作为视频封面 string pathString AppDoma
  • overleaf怎么输入中文_OverLeaf v2 的入门及中文编辑

    Overleaf 以前的WriteLaTex 是一种可在线使用的LaTex文档的书写平台 用户可以不用花费大量的时间和精力在自己的机器上搭建Tex环境 他们可以方便地在线编辑和书写LaTex文档 2017年6月 类似的平台 ShareLaT
  • TB-RK3399pro成砖后Typec无法连接电脑的方法

    TB RK3399pro 即为toybrick的3399pro板 成砖原因 强行刷友善之臂的3399固件 且失败 解决方法 1 断开所有连接 2 用Typec连接电脑 3 按下板子正面的 maskrom 按键 在散热片固定钉旁的一个小按键
  • USB数据接口类型

    为了方便下载数码相机记忆体中的文件 数码相机和PC的连接有多种方式 常见的就是USB接口和IEEE1394火线接口 USB与IEEE1394比较 两者的传输速率不同 过去 很多人都会选用IEEE1394作传输文件用 因为其流量比USB1 1
  • 开环与闭环传递函数波特图的意义

    注 本文默认读者都是控制类专业 先复习一下奈氏曲线和奈氏判据 以及波特图 下面进入今天的主题 开环与闭环传递函数波特图的意义 分为如下三个部分 开环波特图的意义 闭环波特图的意义 为什么大多研究开环波特图 开环与闭环传递函数 一个典型的控制
  • stm32学习—库函数总结

    库函数总结这一章 描述了一般stm32开发的流程 一些常用库函数的设置 一般一开始是使用结构体进行数据的初始化 然后通过使用的途径进行划分 比如常用的数据的输出和输出 这在大部分的外设中都是大量涉及的 再接是辅助我们进行逻辑代码的设计的状态
  • 如何在Java项目中定义并调用自己编写的native方法?

    如何在Java项目中定义并调用C C 编写的native方法 开发工具 编写测试的java代码 编写C 代码 将dll文件链接到java项目中 总结 开发工具 IntelliJ IDEA 2020 用来编写java代码 Visual Stu