JNI实现Java调用C++函数

1. 测试环境

  • 操作系统:win10
  • JDK版本:JDK11 安装教程
  • gcc版本:8.1.0

2. 声明native方法

// HelloJNI.java
public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native static int add(int a, int b);}

3. 生成头文件

javac -h ./ HelloJNI.java

注1:jdk10开始,javah被融合到javac中,使用javac -h替代javah
注2:"./"与"HelloJNI.java"之间需要用空格分开
注3:如果java文件中存在中文注释,可添加编码规则 javac -encoding utf-8 -h ./ HelloJNI.java

// 生成的HelloJNI.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     HelloJNI* Method:    sayHello* Signature: ()V*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jclass);/** Class:     HelloJNI* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_HelloJNI_add(JNIEnv *, jclass, jint, jint);#ifdef __cplusplus
}
#endif
#endif

4. 创建C++文件

// HelloJNI.cpp
#include "HelloJNI.h"
#include <iostream>JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jclass) {std::cout << "Hello from cpp." << std::endl;
}JNIEXPORT jint JNICALL Java_HelloJNI_add(JNIEnv *, jclass, jint a, jint b) {return a + b;
}

5. 生成动态链接库ddl

g++ -o hello.dll -fPIC -shared -I"D:\java\jdk11\include\win32" -I"D:\java\jdk11\include" HelloJNI.cpp

注:两个-I参数的路径需要修改成对应的jdk安装路径

6. 调用C++函数

// HelloJNI.java
public class HelloJNI {static {// 加载C++文件生成的动态链接库// hello为生成的动态链接库名称hello.dllSystem.loadLibrary("hello");}// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native static int add(int a, int b);public static void main(String[] args) {// 调用hell函数HelloJNI.sayHello();// 调用add函数int res = HelloJNI.add(1, 2);System.out.println("res = " + res);}
}

7. HelloJNI.java运行结果

在这里插入图片描述

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

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

相关文章

Android手机投屏方案实现方式对比

文章目录 1.概述2.术语解释2.1 miracast2.2 scrcpy2.4 Wifi Direct2.5 app_process 3.技术实现对比3.1 Miracast3.1.1 Miracast介绍3.1.2 Miracast原理3.1.3 Miracast优缺点分析 3.2 Scrcpy3.2.1 scrcpy 介绍3.2.2 scrcpy的实现原理3.2.3 scrcpy的优缺点分析 3.3 Google cast3.…

【学习笔记】手写 Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…

Python 算法交易实验89 QTV200日常推进-模式思考

说明 过去几天大A的表现还是比较戏剧化的。 让我想到了&#xff1a; 1 价稳量缩模式。之前很长一段时间都是这种状态&#xff0c;最终还是大爆发了&#xff0c;这个可取。2 周期模式。假设价格是一个周期为T(T可变)的正弦波&#xff0c;所以最终还是回到了几个月前的位置&…

软件测试分类极简理解

基础 - 测试分类&#xff08;4 种&#xff09; 1、功能测试&#xff08;难度&#xff1a;2&#xff09; 功能测试用于测试软件的功能是否满足需求规格说明书 它验证软件是否能够执行预期的操作 2、性能测试&#xff08;难度&#xff1a;4&#xff09; 性能测试用于测试软件…

windows环境Python开发环境搭建指南(附实例源码和讲解教程)

windows环境Python开发环境搭建指南(附实例源码和讲解教程) 本指南将帮助您从零开始搭建一个Python开发环境&#xff0c;包括安装Python、配置环境变量、设置pip镜像源以及创建虚拟环境等步骤。请按照以下步骤操作&#xff1a; 1. 安装Python 首先&#xff0c;请访问Python官…

UE学习篇ContentExample解读------Blueprints Advanced-下

文章目录 总览描述批次阅览2.1 Timeline animation2.2 Actor tracking2.3 Button Trigger using a blueprint interface2.4 Opening door with trigger2.5 Child Blueprints 概念总结致谢&#xff1a; 总览描述 打开关卡后&#xff0c;引入眼帘的就是针对关卡的总体性文字描述&…

【NodeJS】npm、yarn、pnpm当前项目设置国内镜像源

全局设置镜像源&#xff0c;可以参考下这篇文章&#xff0c;还挺详细&#xff1a;《npm、yarn、pnpm 最新国内镜像源设置和常见问题解决》 临时设置镜像源&#xff1a;《npm永久或临时切换源》 有时候可能要同时多个开发项目&#xff0c;又不想修改全局的镜像源(具体场景…自行…

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点&#xff1a; 高精度与稳定性 高精度测量&#xff1a;数字式温度传感器芯片&#xff0c;如DS18B20&#xff0c;采用芯片集成技术&#xff0c;能够有效抑制外界不…

若依开源系统多数据源整合clickhouse数据库详细步骤

1.添加依赖【pom.xml文件】 <!-- clickhouse数据源依赖--><dependency><groupId>ru.yandex.clickhouse</groupId>

JavaSE之异常专题

JavaSE之异常专题 1. java的异常体系 Java.lang.Throwable&#xff1a;java中的所有错误和异常的父类Error&#xff1a;代表系统级别错误&#xff08;属于严重问题&#xff09;&#xff0c;也就是说系统一旦出现问题&#xff0c;sun公司会把这些问题封装成Error对象给出来Exc…

算法宝典——二分查找算法

1.认识二分查找 二分查找的时间复杂度:O(logN) 二分查找属于算法中耳熟能详的一类&#xff0c;通常的我们会说只有数组有序才可以使用二分查找&#xff0c;不过这种说法并不完全正确&#xff0c;只要数据具有"二段性"就可以使用二分查找&#xff0c;即我们可以找出一…

【零散技术】Odoo PDF 打印问题问题合集

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo PDF打印 是一个必备功能&#xff0c;但是总会遇到一些奇奇怪怪的问题&#xff0c;此帖仅做记录&#xff0c;方便查阅。 目录 1、样式丢失 2、部分结构丢失 3、没有中文字体 1、样式丢失 这种情况一般是由于 …

ppt压缩有什么简单方法?压缩PPT文件的几种方法

ppt压缩有什么简单方法&#xff1f;许多用户常常面临文件过大的问题&#xff0c;尤其在需要通过电子邮件发送或上传至网络平台时&#xff0c;大文件会带来诸多麻烦。此外&#xff0c;较大的文件可能导致软件响应缓慢&#xff0c;从而影响整体的演示体验。因此&#xff0c;寻找有…

C++ 基础入门-命名空间、c++的输入输出、缺省参数、函数重载、引用、内联函数超详细讲解

这篇文章主要对c的学习做一个基础铺垫&#xff0c;方便后续学习。主要通过示例讲解命名空间、c的输入输出cout\cin&#xff0c;缺省参数、函数重载、引用、内联函数&#xff0c;auto关键字&#xff0c;for循环&#xff0c;nullptr以及涉及到的周边知识&#xff0c;面试题等。为…

机械键盘驱动调光DIY--【DAREU】

1 下载键盘对应的驱动&#xff0c;不要装到C盘 达尔优驱动下载中心 2 驱动更改教程 标准模式 键盘功能 鼠标功能 切换灯光 切换配置文件 多媒体 windows快捷键 禁用 Fn 启动程序 文本功能 光标定位 FN模式 灯光效果设置 注意 宏--自定义功能

RK3568平台(camera篇)tp9930调节亮度色度锐度对比度

一.TP9930说明 1.1说明 TP9930是支持高清传输视频接口(HD)的通用HD/SD视频解码器- TVI)视频、NTSC/PAL CVBS视频以及常见的HD模拟视频格式解码。它集成了4个多标准解码器,可同时对现有的HD模拟格式进行4通道解码。它还可以与任何传统的CVBS相机兼容,以实现向后兼容性。…

spring:spring 中的初始化操作

参考 https://www.jb51.net/program/322735nvy.htmhttps://blog.csdn.net/weixin_40511641/article/details/136843198

Python(七)- 文件操作

目录 文件操作 打开文件 读数据 写数据 关闭文件 文件读写实例 文件写 文件读 读数据类型 备份文件 os模块 目录的具体操作 文件操作 在Python中操作文件记录信息的步骤&#xff1a; &#xff08;1&#xff09;打开文件&#xff0c;或新建一个文件&#xff1b; o…

Qt 项目优化实践方向

目录 1. 使用智能指针2. 避免在全局或静态作用域中使用裸指针3. 利用Qt的对象树进行资源管理4. 延迟加载和按需加载资源5. 合理使用Qt的资源文件&#xff08;qrc&#xff09;6. 监控和调试内存使用7. 优化数据结构8. 减少不必要的资源复制9. 使用缓存机制10. 遵循RAII原则 以下…

面试扩展知识点

1.C语言中分为下面几个存储区 栈(stack): 由编译器自动分配释放堆(heap): 一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;程序结束时可能由OS回收全局区(静态区): 全局变量和静态变量的存储是放在一块的&#xff0c;初始化的全局变量和静态变量在一块区域&#…