根据.h头文件中的方法声明,在 C/C++ 源文件中实现对应的函数

1、定义native函数:

public class MathUtils {public native int add(int a, int b);public native int subtract(int a, int b);static {System.loadLibrary("MathUtils");}
}

2、生成头文件:

使用 javah 命令生成对应的 C 头文件 com_example_MathUtils.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_MathUtils */#ifndef _Included_com_example_MathUtils
#define _Included_com_example_MathUtils
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_example_MathUtils* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_com_example_MathUtils_add(JNIEnv *, jobject, jint, jint);/** Class:     com_example_MathUtils* Method:    subtract* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_com_example_MathUtils_subtract(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

3、在 C++ 源文件 MathUtils.cpp 中实现这两个方法:

注意:

  • 引入头文件;
  • 函数的命名和参数类型需要与头文件中的声明一致
#include "com_example_MathUtils.h"JNIEXPORT jint JNICALL Java_com_example_MathUtils_add(JNIEnv* env, jobject obj, jint a, jint b) {return a + b;
}JNIEXPORT jint JNICALL Java_com_example_MathUtils_subtract(JNIEnv* env, jobject obj, jint a, jint b) {return a - b;
}

方法解释:

  • 函数声明使用 extern “C” 包裹,确保使用 C 语言的函数名修饰规则。
  • 参数类型和返回值类型使用 JNI 定义的 C++ 类型,如 jint 对应 int。
  • JNIEnv* 参数用于与 Java 端进行交互。
  • jobject 参数是调用该 native 方法的 Java 对象实例。

4、编译、使用:

编译这个 C++ 源文件,生成动态链接库文件 libMathUtils.so(或 .dll)。
最后在 Java 端加载这个动态库并调用 native 方法:

public class Main {public static void main(String[] args) {System.loadLibrary("MathUtils");MathUtils utils = new MathUtils();int result = utils.add(2, 3);System.out.println("2 + 3 = " + result); // Output: 2 + 3 = 5result = utils.subtract(10, 4);System.out.println("10 - 4 = " + result); // Output: 10 - 4 = 6}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串联式 VS 并联式电源连接拓扑

https://download.csdn.net/download/qq_42605300/89538758https://download.csdn.net/download/qq_42605300/89538758串联式电源连接拓扑&#xff1a; 缺点&#xff1a;公共阻抗耦合&#xff0c;引入更多共模干扰。 并联式(星型)电源连接拓扑&#xff1a; 缺点&#xff1a;接地…

【Python】基础语法(顺序语句、条件语句、循环语句)

一、顺序语句 默认情况下&#xff0c;Python 的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 编程是一件明确无歧义的事情&#xff0c;安排好任务的顺序&#xff0c;计算机才能够正确的进行执行。 二、条件语句 1、什么是条件语句 条件语句能够表达 “如果...&…

补码是什么意思_补码的性质_补码反码原码的转换

补码是计算机中用来表示有符号整数的一种编码方式。它主要用于解决在计算机中整数加减法运算时的方便性和统一性。   补码的定义&#xff1a;   正数的补码&#xff1a;正数的补码与其原码相同。   例如&#xff0c;十进制数 5 的二进制原码是 00000101&#xff0c;补码也…

架构师机器学习操作 (MLOps) 指南

MLOps 是机器学习操作的缩写&#xff0c;是一组实践和工具&#xff0c;旨在满足工程师构建模型并将其投入生产的特定需求。一些组织从一些自主开发的工具开始&#xff0c;这些工具在每次实验后对数据集进行版本控制&#xff0c;并在每个训练周期后对检查点模型进行版本控制。另…

【qt】 QGridLayout布局管理器怎么用?

QGridLayout是 Qt 中的一个布局管理器&#xff0c;用于在窗口或对话框中创建网格布局。它将控件按照行和列的方式进行排列&#xff0c;使得界面更加整齐和有序。 可以用setSpacing()来设置各个主键之间的间距. 可以设置各组件之间的间隙和与窗口边界的边距. 用addWidget()来添…

金币程序题

昨天&#xff0c;小孩问了我一个python编程竞赛题&#xff0c;我看了一下题目&#xff0c;是一个数列编程的问题&#xff0c;我在想&#xff0c;小学五年级的学生能搞得懂吗&#xff1f;反正我家小孩是没有搞懂&#xff0c;不知道别人家的小孩能不能搞明白。所以我花了一点时间…

国道省道乡道见闻

在开始的时候&#xff0c;我看了下路线&#xff0c;发现在两个大道之间的路&#xff0c;有个是城区&#xff0c;我想着城区红绿灯多人多&#xff0c;便自作聪明的把路线改为到乡镇的&#xff0c;然后走下来感觉半斤八两吧&#xff0c;其中一段路是二车道&#xff0c;但是路两边…

1.Introduction to Spring Web MVC framework

Web MVC framework 文档&#xff1a;22. Web MVC framework (spring.io) 概述 Web MVC框架&#xff08;Web Model-View-Controller Framework&#xff09;是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&am…

AQS之ReentrantLock源码分析

目录 1. LockSupport 类 2. 如何设计一把独占锁&#xff1f; 3. 管程 — Java同步的设计思想 3.1 MESA模型 为什么条件队列的线程需要移到同步队列再唤醒运行&#xff1f; 4. AQS原理分析 4.1 什么是AQS 4.2 AQS核心结构 AQS内部维护属性volatile int state 4.3 AQS定义…

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…

[web]-sql注入-白云搜索引擎

ctrlu查看源代码&#xff0c;发现前端有js过滤 <script>function myFunction(){var xdocument.getElementById("number").value;var adocument.getElementById("word").value;var ba.replace(/[\ |\~|\|\!|\|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\|\…

通过vm可以访问那些属性——06

1.通过vue实例都可以访问那些属性&#xff1f;&#xff08;通过vm都可以vm.什么&#xff09; vue实例中的属性很多。有的以$开始&#xff0c;有的以_开始。 所有以$开始的属性&#xff0c;可以看做是公开的属性&#xff0c;这些属性是提供给程序员使用的 所有以_开始的属性&…

Redis学习笔记(个人向)

Redis学习笔记(个人向) 1. 概述 是一个高性能的 key-value 数据库&#xff1b;其具有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据&…

《昇思25天学习打卡营第19天|生成式-Pix2Pix实现图像转换》

学习内容&#xff1a;Pix2Pix实现图像转换 1.模型简介 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c…

【YOLO系列】快速部署YOLOv5(Windows)

引言 在计算机视觉领域&#xff0c;目标检测是至关重要的任务之一&#xff0c;它涉及识别图像或视频中的对象&#xff0c;并将其分类和定位。近年来&#xff0c;**YOLO&#xff08;You Only Look Once&#xff09;**算法因其速度与精度的平衡而变得非常流行。在这篇博文中&…

防火墙NAT智能选举综合实验

目录 实验拓扑 实验要求 实验思路 实验配置 需求7 需求8 需求9 需求10 需求11 实验拓扑 实验要求 7.办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8.分公司设备可以通过总公司的移动链路和电信链路访问到d…

电表及销售统计Python应用及win程序

暑假每天都要填表算账很烦躁&#xff0c;就整了个小程序来减轻压力 程序可以做到记录输入的每一条数据&#xff0c;并用新数据减去旧数据算新增的量&#xff0c;同时记录填写时间 Python代码 import json import os # 导入os模块 from datetime import datetime from tkint…

yolov8预测

yoloV8 官方地址 预测 -Ultralytics YOLO 文档 1.图片预测 from ultralytics import YOLO #### 图片预测1 ### https://www.youtube.com/watch?vneBZ6huolkg ### https://github.com/ultralytics/ultralytics ### https://github.com/abdullahtarek/football_analysis…

细数「人力资源」的「六宗罪」

细数「人力资源」的「六宗罪」 不要让人力资源成为企业发展的障碍 人力资源的六宗罪: 招聘与配置培训与开发薪酬与绩效请您先「点赞」+「在看」+「收藏」+关注@netkiller,转发给你的朋友,再慢慢看,方便查看往期精彩文章,以防手划找不到,您的支持就是我最大的动力。 人力…

C++学习指南(一)——C++入门基础

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括C第一个程序&#xff0c;命名空间&#xff0c;缺省参数&#xff0c;函数重载&#xff0c;引用、inline以及nullptr这些基础概念。 在进入正题之前&#xff0c;我需要先阐述一下。本系列涉及的内容为C部分&#xff0c;可以理解为…