C/C++与Java混合的JNI编程
Java与JNI1.1. 什么是Java?Java是一种高级编程语言也是一个计算平台(通常指Java虚拟机)。最初由Sun Microsystems公司后被Oracle收购的James Gosling和他的团队在1995年发布。Java语言的设计目标是简单性、健壮性和跨平台兼容性。以下是Java的一些关键特点面向对象Java是一种面向对象的语言这意味着它基于对象和类的概念。对象代表现实世界中的实体或概念而类是创建对象的模板。平台无关性Java的一个核心特性是“一次编写到处运行”Write Once, Run AnywhereWORA。Java程序在执行前会被编译成字节码这种中间形式的代码可以在任何安装了Java虚拟机JVM的设备上运行。自动内存管理Java提供了自动垃圾回收机制这意味着程序员不需要手动管理内存的分配和释放从而减少了内存泄漏和其他内存相关错误。丰富的标准库Java拥有一个庞大的标准库也称为Java API提供了大量预先构建的类和接口用于处理文件输入/输出、网络编程、多线程编程、数据结构等。跨平台兼容性Java不仅可以在不同的操作系统上运行还可以在嵌入式系统、移动设备和大型服务器上运行。Java的应用场景广泛是目前最流行的后端系统开发语言此外Java还是Android系统的主要编程语言绝大部分的Android应用程序都基于Java语言进行开发。1.2. 什么是JVM?JVM(Java Virtual Machine)是一个可以执行Java字节码的虚拟计算机。它是Java平台的核心组成部分提供了Java程序运行所需的环境。JVM是Java语言能做到“一次编写到处运行”的基础。以下是JVM的一些关键特点和功能平台无关性JVM的主要目的是实现Java的跨平台特性。Java源代码被编译成平台无关的字节码这些字节码可以在任何安装了相应JVM的设备上运行。字节码解释器JVM包含一个字节码解释器它负责将字节码转换为特定平台的机器码。这个过程使得Java程序可以在不同的操作系统和硬件上运行。即时编译器JIT为了提高性能现代JVM通常包含一个即时编译器。JIT编译器会将热点代码频繁执行的代码编译成优化的机器码以提高执行效率。垃圾回收JVM负责管理内存分配和回收。它提供了自动垃圾回收机制帮助程序员管理内存减少内存泄漏和其他内存相关错误。安全沙箱JVM提供了一个安全的执行环境可以限制代码对系统资源的访问。这有助于防止恶意代码对系统造成破坏。类加载器JVM包含一个类加载器子系统负责动态加载、验证和准备类文件以供执行。类加载器确保类文件的完整性和安全性。本地接口JVM提供了与本地库交互的接口如JNIJava Native Interface允许Java代码调用本地代码C/C等以实现特定功能或性能优化。多线程支持JVM支持多线程执行允许程序同时执行多个任务。1.3. 什么是JNI?JNI(Java Native Interface)是一个允许Java代码与本地代码(如C/C)进行交互的接口。通过JNIJava应用程序可以调用本地库中的函数也可以被本地代码调用它是实现Java与C/C混合编程的关键机制。JNI主要包含以下两部分内容Java代码与本地代码交互的接口。支持JNI开发的一套开发工具如javah、javac等。JNI接口的官方文档https://docs.oracle.com/en/java/javase/21/docs/specs/jni/index.html1.4. 环境说明本章所有的示例代码的开发环境如下操作系统: Ubuntu 24.04JDK版本 21.0.5GCC版本 13.3.0开发工具VSCode2. 开发环境搭建2.1. Windows在官网下载最新版本的安装包官网下载地址https://www.oracle.com/cn/java/technologies/downloads/双击安装包根据提示一步步安装即可。打开命令行输入一下命令验证是否安装成功如果有显示相应的版本号则说明安装成功。java -version2.2. Linux(Ubuntu)安装JDK:# 1. 更新软件包列表sudo apt update# 3. 该命令将自动选择并安装最新的 LTS 版本当前是 OpenJDK 21[5]。sudo apt install default-jdk# 3. 验证是否安装成功如果有显示相应的版本号则说明安装成功。java --version设置环境变量# 1. 查找JDK的安装路径update-alternatives --config javaThere are 2 choices for the alternative java (providing /usr/bin/java).Selection Path Priority Status------------------------------------------------------------* 0 /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2111 auto mode1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode# 2. vim打开.zshrc(如果你的SHELL用的是.bashrc替换成相应的.bashrc)vim ~/.zshrc# 3. 在文件末尾添加如下内容export JAVA_HOME/usr/lib/jvm/java-21-openjdk-amd64export PATH${JAVA_HOME}/bin:${PATH}# 4. 重新加载配置source ~/.zshrc2.3. macOS以下是通过Homebrew工具的安装步骤确保已经安装Homebrew。# 1. 更新软件包列表brew update# 2.1 安装Oracle JDK的最新版本brew install oracle-jdk# 2.2 安装Open JDK的最新版本brew install java# 3. 验证是否安装成功如果有显示相应的版本号则说明安装成功。java --version2.4. Open JDK与Oracle JDKJava语言最初由Sun公司研发并发布了Java SE(Standard Edition)的规范和开源的Open JDK。Sun公司后被Oracle公司收购Oracle基于Open JDK开发了Oracle JDK。Open JDK是一个完全开源的项目遵循GPL v2许可。任何人都可以下载、使用、修改和分发它的代码。主要的Linux发行版(如FedoraUbuntu等)提供OpenJDK作为默认的Java SE实现。Oracle JDK则基于Open JDK构建但包含一些闭源组件如Java插件、Java WebStart的实现和一些第三方组件。这些组件包括了一些商业功能未开源。Open JDK和Oracle JDK都遵循Java SE的规范只是Oracle JDK提供了更多商业版的未开源的功能。3.Say Hello程序3.1. 新建SayHello.java新建一个say_hello的测试目录然后在该目录下新建一个SayHello.java文件并编写如下代码public class SayHello {// 类方法private native void sayHello(String name);// 静态方法private static native void sayGoodbye(String name);static {// 在程序初始化时加载native动态库(libhello.so)System.loadLibrary(hello);}public static void main(String[] args) {new SayHello().sayHello(Spencer);SayHello.sayGoodbye(陌尘);}}说明这里有两个被声明为native的方法表示这两个方法需要native代码(C/C)实现。这里一个是普通的类成员方法一个是静态的类方法。private native void sayHello(String name);private static native void sayGoodbye(String name);static包含的代码块表示在程序初始化时加载native动态库(libhello.so)static {System.loadLibrary(hello);}3.2. 编译SayHello.javajavac ./SayHello.java执行完成后会生成一个SayHello.class的字节码文件。3.3. 生成SayHello.h执行以下命令生成native代码的头文件# JDK 9.0 之前javah -cp ./ -d ./ SayHello# -cp ./表示设置classpath为当前目录在当前目录下查找.class文件# -d ./表示设置头文件的输出目录为当前目录# JDK 9.0 及之后javac -h ./ ./SayHello.java# 第一个./ 表示设置头文件的输出目录为当前目录执行成功后会在当前目录下生成SayHello.h头文件内容如下/* DO NOT EDIT THIS FILE - it is machine generated */#include jni.h/* Header for class SayHello */#ifndef _Included_SayHello#define _Included_SayHello#ifdef __cplusplusextern C {#endif/** Class: SayHello* Method: sayHello* Signature: (Ljava/lang/String;)V*/JNIEXPORT void JNICALL Java_SayHello_sayHello(JNIEnv *, jobject, jstring);/** Class: SayHello* Method: sayGoodbye* Signature: (Ljava/lang/String;)V*/JNIEXPORT void JNICALL Java_SayHello_sayGoodbye(JNIEnv *, jclass, jstring);#ifdef __cplusplus}#endif#endif代码说明

相关新闻

C++ PDF解析渲染库Poppler全方位实战:场景、库对比、CMake集成、可运行代码

C++ PDF解析渲染库Poppler全方位实战:场景、库对比、CMake集成、可运行代码

C 生态一直缺少开箱即用、稳定可靠的 PDF 处理库。Poppler 是工业级开源 PDF 解析与渲染引擎,基于老牌 Xpdf 重构,广泛用于 Linux 桌面、服务端文档解析、PDF 预览、文本抽取、格式转换。本文详细讲解 Poppler 核心能力、适用业务场景、与 MuPDF / PDFiu…

2026/7/2 1:48:29阅读更多 →
采齿背后的能量闭包原理

采齿背后的能量闭包原理

感谢您的补充说明。您提到的“采齿”概念,确实与能量自持和能量闭包密切相关,涉及能量输入与状态维持之间的关系。这是一个非常深刻的视角。不过,为了能更准确地为您提供帮助,我需要澄清一下:在标准的医学或牙科术语中…

2026/7/2 1:48:29阅读更多 →
2026年AI写作辅助软件全景评测:这5款工具如何重塑学术生产力

2026年AI写作辅助软件全景评测:这5款工具如何重塑学术生产力

从文献阅读到论文成稿,现代学术写作已经进入智能协作新时代。本文将带你了解当前最实用的 5 款 AI 写作工具,助你构建高效的科研工作流。 深夜的实验室里,键盘敲击声此起彼伏。作为即将毕业的博士生,我深知论文写作的艰辛&#xf…

2026/7/2 1:43:29阅读更多 →
Python异步编程实战技巧全解析

Python异步编程实战技巧全解析

Python异步编程实战技巧全解析在当今高并发的网络应用开发中,异步编程已成为Python开发者必须掌握的核心技能。从传统的回调地狱到现代的async/await语法,Python异步编程经历了革命性的演进。本文将深入解析Python异步编程的实战技巧,帮助开发…

2026/7/2 2:48:33阅读更多 →
Python OpenCV图像识别实践

Python OpenCV图像识别实践

Python OpenCV图像识别实践:从像素到智能的跨越在人工智能浪潮席卷全球的今天,图像识别技术已成为连接数字世界与现实世界的桥梁。而Python与OpenCV的组合,则为这一领域的研究者和开发者提供了一把强大而灵活的工具。本文将深入探讨基于Pytho…

2026/7/2 2:48:33阅读更多 →
MySQL存储过程开发

MySQL存储过程开发

MySQL存储过程开发:从脚本到企业级数据逻辑封装在当今数据驱动的商业环境中,数据库不仅仅是静态存储容器,更是业务逻辑的核心载体。MySQL作为最流行的开源关系型数据库之一,其存储过程功能为企业级应用开发提供了强大的数据逻辑封…

2026/7/2 2:48:33阅读更多 →
React性能优化

React性能优化

React性能优化:构建高效前端应用的实践指南在当今快速发展的Web应用领域,React作为最流行的前端框架之一,其性能优化已成为开发者必须掌握的核心技能。随着应用规模不断扩大,性能问题往往成为制约用户体验的关键因素。本文将深入探…

2026/7/2 2:48:33阅读更多 →
前端工程化构建工具链配置实战教程

前端工程化构建工具链配置实战教程

前端工程化构建工具链配置实战教程前端工程化已成为现代Web开发的标配,它通过自动化流程提升开发效率、保障代码质量。本文将带你从零开始配置一套完整的前端工程化工具链,涵盖开发、构建、测试到部署的全流程。一、环境初始化与包管理首先确保已安装Nod…

2026/7/2 2:48:33阅读更多 →
【JAVA毕设源码分享】基于Web的社交媒体平台的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于Web的社交媒体平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/2 2:43:33阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/1 4:42:14阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/1 5:19:01阅读更多 →
塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想在《塞尔达传说:旷野之息…

2026/7/2 0:03:01阅读更多 →
告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

在本地开发环境使用云厂商 CLI 时,传统的 AccessKey(AK)方式需要手动创建、下载和保管密钥,不仅繁琐,还存在泄漏风险。其实,主流云平台都已提供基于 OAuth 2.0 的免密认证方案,让开发者可以通过浏览器登录一次性完成授权,CLI 自动管理临时凭证的刷新,兼顾了便利与安全…

2026/7/2 0:03:01阅读更多 →
基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

1. 项目背景与核心价值在嵌入式系统开发领域,高精度定位与导航一直是极具挑战性的技术方向。传统方案往往面临成本、精度和实时性难以兼顾的困境。这个项目通过13DOF(13自由度)传感器组合与PIC32MZ2048EFH100高性能MCU的协同工作,…

2026/7/2 0:03:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/2 0:33:58阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/2 1:32:11阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/2 1:50:13阅读更多 →