Java在JNI(JavaNativeInterface)中的高性能实践

简介: Java需要调用C/C++库:操作系统API、硬件驱动、加密算法、遗留代码。JNI是标准桥接技术。但不当使用JNI会带来性能损失和内存崩溃。https://builder18.com正确实践能接近本地性能。

1.JNI的应用场景
Java需要调用C/C++库:操作系统API、硬件驱动、加密算法、遗留代码。JNI是标准桥接技术。但不当使用JNI会带来性能损失和内存崩溃。正确实践能接近本地性能。
参考:https://oqmyh.cn/category/kang-shuailao.html

2.减少边界开销
批处理:避免在循环中逐个调用native方法,而是传入数组,在native端处理整个数组。
直接缓冲区:使用ByteBuffer.allocateDirect,native代码可以直接访问内存,避免复制。
Critical数组:使用GetPrimitiveArrayCritical获取指针,但会阻塞GC,需尽快释放。
缓存jmethodID/jfieldID:在native代码中缓存,避免每次调用GetMethodID。

3.内存管理
释放本地引用:DeleteLocalRef,否则可能导致本地引用表溢出(默认512个)。
全局引用:NewGlobalRef需配对DeleteGlobalRef,否则内存泄漏。
异常检查:调用Java方法后需ExceptionOccurred并处理。

4.使用JNI的性能比较
一个图像处理任务:纯Java实现vs调用C++OpenCV。JNI版本使用GetDirectBufferAddress直接操作像素数据,耗时12ms;Java版本使用BufferedImage操作需85ms。但JNI调用本身每次约50ns,几乎可忽略。
参考:https://oqmyh.cn/category/hufu-chengfen.html

5.案例:密码学加速
某金融系统需要高频签名(SM2算法)。Java实现的签名速度慢,使用JNI调用C++的GMSSL库。策略:
一次JNI调用处理一批签名请求(数组),避免多次JNI边界切换。
使用DirectBuffer传递签名参数。
在native层管理签名上下文对象,Java层持有long指针,避免创建新对象。
最终签名吞吐量提升10倍。

6.替代方案
Java外部内存访问API(ForeignMemoryAccess):Java14预览,18正式,比JNI更简单。
JNA:动态调用,无需生成头文件,但性能低于JNI。
ProjectPanama:未来替代JNI。

7.总结
JNI是Java调用本地代码的经典方式。正确使用批处理、直接缓冲区和缓存,可以获得接近原生的性能。对于需要复用大量C/C++库的Java项目,JNI是必不可少的工具。
参考:https://oqmyh.cn

目录
相关文章
|
1天前
|
人工智能 安全 前端开发
多资产数字金融场景下新型诈骗攻击与全域防御体系研究
本文聚焦多资产数字金融时代诈骗新态势,剖析AI深度伪造、恶意合约、跨平台社工等八大诈骗类型,提出“技术+运营+教育+协同”四位一体全域防御体系,并附前端钓鱼拦截、安全合约授权、链上监控等可落地代码,为行业提供理论支撑与实践方案。(239字)
28 1
|
15小时前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
89 4
|
14小时前
|
存储 缓存 JSON
【剪映小助手】添加音频接口(Add Audios)
本文档介绍草稿自动化中音频接口的集成方案,涵盖用途说明、组件依赖(含外部库与内部模块)、性能优化(下载、内存、并发)、常见错误码及排查指南,并强调以OpenAPI为准的字段与校验规范。(239字)
|
21小时前
|
中间件 API PHP
PHP在数据脱敏与隐私保护中间件中的实践
随着《个人信息保护法》、GDPR等法规的实施,企业需要对用户敏感信息(手机号、身份证、银行卡号、邮箱)进行脱敏处理。通常场景https://iwanttofly.cn包括:API返回给前端的日志中不能包含明文敏感数据;数据库查询时的动态脱敏;导出文件时的自动遮盖。
18 0
|
21小时前
|
消息中间件 C++ 计算机视觉
C++在进程间通信(共享内存与消息队列)中的高性能实践
多进程架构中,进程间需要交换数据。相比网络socket,共享内存提供了最低延迟的通信方式(纳秒级),https://empirechem.cn适合高频数据交换场景(如实时行情分发、图像处理流水线)
29 0
|
22小时前
|
传感器 消息中间件 调度
C++在嵌入式实时操作系统(FreeRTOS)中的任务调度与通信
FreeRTOS是一个轻量级实时操作系统内核,广泛用于微控制器(如ARMCortex-M、AVR、ESP32)。虽然FreeRTOS主要参考:https://sdfxgc.cn用C编写,但它提供了完整的C++封装,允许开发者使用C++类和对象来创建任务、队列、信号量。
24 0
|
22小时前
|
机器学习/深度学习 并行计算 C++
C++在机器学习推理引擎ONNXRuntime中的高性能实现
ONNX(开放神经网络交换格式)是一种跨框架的模型表示标准。ONNXRuntime(ORT)是微软开源的推理引擎,支持CPU、GPU、FPGA等https://mykunlian.com多种后端,完全由C++实现。
29 0
|
21小时前
|
编解码 Java PHP
PHP、Java、C++在音视频处理转码系统中的协作
音视频转码(如将AVI转为MP4,调整分辨率、码率)计算密集,耗时长。一个完整的转码系统通常包含:https://bjshihong.com任务管理(用户提交、优先级、状态跟踪)
39 1
|
9天前
|
安全 开发工具 git
软件开发新手入门五大核心技能之版本控制工具(二)
教程来源 http://sdfxgc.cn/ 本章详解Git单人开发核心操作:涵盖仓库创建(init/clone)、文件三状态管理(未跟踪→已暂存→已提交)、status/diff/log实用技巧,以及安全撤销与精准回退(reset/amend/restore/reflog),助你夯实版本控制基础。
75 0
|
9天前
|
JSON 人工智能 前端开发
软件开发新手入门五大核心技能之学习与文档阅读能力(一)
教程来源 http://aescc.cn/ 本文聚焦软件开发新手的两大核心能力:持续学习力与高效文档阅读力。指出它们才是突破技术门槛、实现自主成长的第一关键,远胜于单纯写代码。内容涵盖搜索技巧、提问方法、AI辅助策略及分层读文档法(如MDN/Express实战),助你建立扎实自学体系。
95 0