1、GetStringUTFChars

用于将 Java 字符串(jstring)转换为 UTF-8 编码的 C 风格字符串(const char*)。

必须在使用完后调用 ReleaseStringUTFChars 释放内存,否则可能导致内存泄漏。

std::string data_converter::convertJavaStringToCpp(JNIEnv* env, jstring jStr) {const char* cStr = env->GetStringUTFChars(jStr, nullptr);std::string result(cStr);env->ReleaseStringUTFChars(jStr, cStr);return result;
}

2、NewStringUTF

用于将 C/C++ 的 UTF-8 字符串 转换为 Java 的 jstring 对象。

const char *cStr = "Hello from C++! 你好!";
jstring javaStr = env->NewStringUTF(cStr);

3、GetArrayLength

用于获取 Java 数组的长度。

JNIEXPORT jint JNICALL Java_Example_getArrayLength(JNIEnv *env, jobject obj, jintArray arr) {jsize length = env->GetArrayLength(arr);return length;
}

4、GetObjectArrayElement

用于从 Java 对象数组中获取指定索引处的元素。

对于基本类型数组(如 int[], float[] 等),不能直接使用 GetObjectArrayElement,而应该使用对应的函数如 GetIntArrayElements。

JNIEXPORT void JNICALL Java_Example_printArrayElements(JNIEnv *env, jobject obj, jobjectArray arr) {jsize length = env->GetArrayLength(arr);for (jsize i = 0; i < length; i++) {jobject element = env->GetObjectArrayElement(arr, i);// 对 element 进行操作...}
}

5、GetByteArrayRegion

用于将 Java 字节数组 (jbyteArray) 的一部分或全部复制到 C/C++ 的本地缓冲区中。

JNIEXPORT void JNICALL Java_Example_processByteArray(JNIEnv *env, jobject obj, jbyteArray javaArray) 
{// 获取数组长度jsize length = env->GetArrayLength(javaArray);// 分配本地缓冲区jbyte *buffer = new jbyte[length];// 复制整个数组到本地缓冲区env->GetByteArrayRegion(javaArray, 0, length, buffer);// 处理数据...for (jsize i = 0; i < length; i++) {// 处理 buffer[i]...}// 释放本地缓冲区delete[] buffer;
}

6、(void)env; 和 (void)instance;

这两行是用于 显式忽略未使用参数 的编程技巧。

static void saveDeviceID(JNIEnv* env, jobject instance, jstring devID)
{(void)env;      // 明确表示不使用 env 参数(void)instance; // 明确表示不使用 instance 参数// ...
}

7、GetObjectClass

用于在 C/C++ 代码中获取 Java 对象的类引用。它通常在编写本地方法(native methods)时使用。

#include <jni.h>JNIEXPORT void JNICALL Java_Example_printClassName(JNIEnv *env, jobject obj) {// 获取传入对象的类jclass cls = env->GetObjectClass(obj);// 获取类名jmethodID mid_getName = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");jstring name = (jstring)env->CallObjectMethod(cls, mid_getName);const char *str = env->GetStringUTFChars(name, NULL);printf("Class name: %s\n", str);env->ReleaseStringUTFChars(name, str);
}

替代方案

如果你想获取某个已知类的引用(而不是通过对象实例),可以使用 FindClass() 函数:

jclass cls = env->FindClass("java/lang/String");

GetObjectClass() 主要用于当你已经有一个对象实例但需要访问其类信息时使用。

8、NewGlobalRef

用于创建一个全局引用(global reference)到 Java 对象。全局引用在本地代码中跨多个本地方法调用时保持有效,直到显式释放。

// 全局变量存储引用
jclass globalClassRef;JNIEXPORT void JNICALL Java_Example_init(JNIEnv *env, jobject obj) {// 获取局部引用jclass localClassRef = env->GetObjectClass(obj);// 创建全局引用globalClassRef = (jclass)env->NewGlobalRef(localClassRef);// 局部引用不再需要时可以删除env->DeleteLocalRef(localClassRef);
}JNIEXPORT void JNICALL Java_Example_cleanup(JNIEnv *env, jobject obj) {// 不再需要时释放全局引用if (globalClassRef != NULL) {env->DeleteGlobalRef(globalClassRef);globalClassRef = NULL;}
}

相关函数

  • DeleteGlobalRef(): 释放全局引用

  • NewLocalRef(): 创建局部引用

  • NewWeakGlobalRef(): 创建弱全局引用

9、

    NetworkManagerCallback() = default;virtual ~NetworkManagerCallback() = default;NetworkManagerCallback(const NetworkManagerCallback& other) = delete;NetworkManagerCallback& operator=(const NetworkManagerCallback& other) = delete;

这几行代码展示了一个类中常见的特殊成员函数的声明和定义方式。

  1. NetworkManagerCallback() = default;

    • 使用编译器生成的默认构造函数

    • 示例:当创建NetworkManagerCallback对象时,会调用这个默认构造函数

    NetworkManagerCallback callback; // 使用默认构造函数
  2. virtual ~NetworkManagerCallback() = default;

    • 声明虚析构函数并使用默认实现

    • 使得这个类可以作为基类被继承,且能正确调用派生类的析构函数

    • 示例:

    class DerivedCallback : public NetworkManagerCallback {~DerivedCallback() override { /* 清理资源 */ }
    };
  3. NetworkManagerCallback(const NetworkManagerCallback& other) = delete;

    • 禁用拷贝构造函数

    • 示例:以下代码会编译错误

    NetworkManagerCallback cb1;
    NetworkManagerCallback cb2(cb1); // 错误:拷贝构造函数被删除
  4. NetworkManagerCallback& operator=(const NetworkManagerCallback& other) = delete;

    • 禁用拷贝赋值运算符

    • 示例:以下代码会编译错误

    NetworkManagerCallback cb1;
    NetworkManagerCallback cb2;
    cb2 = cb1; // 错误:拷贝赋值运算符被删除

这种模式通常用于:

  • 需要作为基类但不需要拷贝功能的类(如回调接口)

  • 只允许移动不允许拷贝的类

  • 单例模式实现

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

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

相关文章

【学习嵌入式day-29-网络】

进程和线程的区别&#xff1a;都是系统执行的任务进程是资源分配的基本单位线程是调度执行的最小单位进程的创建和切换的开销大&#xff0c;速度慢&#xff0c;效率低空间独立、----- 安全&#xff0c;稳定进程间通信不方便线程创建和切换的开销小&#xff0c;速度快&#xff0…

Eino 框架组件协作指南 - 以“智能图书馆建设手册”方式理解

Eino 框架组件关系 - 形象比喻指南 &#x1f3d7;️ 项目概览&#xff1a;构建一个智能图书馆 想象一下&#xff0c;你要建设一个现代化的智能图书馆&#xff0c;能够帮助用户快速找到所需信息并提供智能问答服务。Eino 框架就像是这个智能图书馆的建设工具包&#xff0c;每个组…

网络打印机自动化部署脚本

下面是一个全面的、交互式的PowerShell脚本&#xff0c;用于自动化网络打印机部署过程。这个脚本提供了图形化界面&#xff0c;让用户可以轻松地搜索、选择和安装网络打印机。 备注&#xff1a;这个脚本未在生产环境测试过&#xff0c;请大家测试一下&#xff0c;有问题或优化&…

探索工业自动化核心:ZMC 系列 EtherCAT 主站控制器

ZLG致远电子的ZMC系列EtherCAT主站控制器&#xff0c;凭借多元内核、丰富接口、卓越通信能力及开放开发环境&#xff0c;为工业自动化提供全方位解决方案&#xff0c;助力企业智能化升级。 前言在工业自动化领域不断演进的今天&#xff0c;可靠且高效的控制解决方案成为企业提…

rt-thread使用sfud挂载qspi flash的trace分析

说明 trace log先贴在这里&#xff0c;待分析完成后&#xff0c;完善文章。 [0m[D/drv.sdram] sdram init success, mapped at 0xC0000000, size is 33554432 bytes, data width is 16[0m\ | / - RT - Thread Operating System/ | \ 5.2.0 build Aug 21 2025 14:44:332…

服务发现与负载均衡:Kubernetes Service核心机制深度解析

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 一、 服务发现与负载均衡&#xff1a;云原生应用的核心支柱 1.1 Kubernetes Service的设计哲学 1.2 服务发现的核心组件 二、 Service核心类型深度解析&#xff1a;从ClusterIP到LoadBalancer 2.1 ClusterI…

【基础排序】CF - 赌场游戏Playing in a Casino

题目描述 在整个太阳系都很有名的赌场 Galaxy Luck 推出了一种新的纸牌游戏。 在这个游戏中&#xff0c;有一副由 nnn 张牌组成的牌堆。每张牌上写有 mmm 个整数。nnn 位玩家各自从牌堆中获得一张牌。 然后所有玩家两两对局&#xff0c;每一对玩家恰好对局一次。 例如&#…

Jenkins启动端口修改失败查找日志

# 查看Jenkins服务启动时的环境变量sudo systemctl show jenkins | grep -i port从systemd服务信息可以看到&#xff0c;Jenkins的环境变量中 JENKINS_PORT8080&#xff0c;这说明systemd服务配置覆盖了 /etc/default/jenkins 文件中的设置1. 查找Jenkins的systemd服务文件# 查…

Rancher部署的K8S集群服务节点上执行 kubectl 命令

文章目录1、Rancher UI 和执行 kubectl 命令之间的关系1.1、Rancher 的架构和 kubectl1.2、Rancher 内置 kubectl 的位置1.3、执行权限和安全2、Rancher UI 的使用操作2.1、UI 界面内置的 Kubectl 命令工具2.2、在服务节点执行 kubectl 命令的方法2.3、创建一个集群上下文文件 …

基于Nodejs作为服务端,React作为前端框架,axios作为通讯框架,实现滑块验证

文章目录基于Nodejs作为服务端&#xff0c;React作为前端框架&#xff0c;axios作为通讯框架&#xff0c;实现滑块验证1. 为什么要自己写滑块验证2. 滑块验证的整体思路3. 具体实现3.1 服务端3.2 前端4. 总结基于Nodejs作为服务端&#xff0c;React作为前端框架&#xff0c;axi…

2025年物流大数据分析的主要趋势

大数据已为物流行业带来革命性变革&#xff0c;助力实现更智能的运营与实时洞察。如今&#xff0c;企业可精准识别瓶颈、优化供应链&#xff1b;自疫情以来&#xff0c;大数据的采用率大幅攀升&#xff0c;79% 的供应链负责人将分析培训列为优先事项。这一转变不仅提升了效率、…

【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法

【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法 母线继电保护动作行为仿真分析系统 【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法 1问题背景 2问题分析 3可能出现的问题 4JTAG问题总结 1问题背景 某客户产品应用中,使用JTAG仿真器时经常会遇到一启动负载或者…

LT8712SX,Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频

简介LT8712SX是一款高性能Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频,支持4K(3840*2316)60Hz 的分辨率,提供 I2S 和 SPDIF 两个数字音频输出接口&#xff0c;均支持 8 通道 LPCM 或压缩音频&#xff0c;最高采样率为 192KHz。应用场景便携式显示器例如&#xff0c;手机通过 T…

C语言基础:(二十)自定义类型:结构体

目录 前言 一、结构体类型的声明 1.1 结构体回顾 1.1.1 结构体的声明 1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明 1.3 结构的自引用 二、结构体内存对齐 2.1 对齐规则 2.1.1 练习1 2.1.2 练习2 2.1.3 练习3&#xff1a;结构体嵌套问题 2.2 为什…

数据仓库分层解析(详细)

目录 一、数据仓库为什么要分层 二、数据仓库怎么分层 1、ODS&#xff08;Operational Data Store&#xff09;&#xff1a;数据源层 2、DW&#xff08;Data Warehouse&#xff09;&#xff1a; 数据仓库层 2.1、DWD&#xff08;Data Warehouse Detail&#xff09;&#x…

智慧城管云平台源码,微服务vue+element+springboot+uniapp技术架构,数字化综合执法办案系统

智慧城管综合执法系统源码&#xff0c;包括PC端和移动端。微服务架构&#xff0c;vueelementspringbootuniapp技术框架开发。智慧城管建立了统一的城管执法案件数据库、法律法规库、档案信息库等&#xff0c;支持简易程序案件、一般程序案件、行政强制管理等执法业务的办理&…

VUE实现多个弹窗优先级变化实现思路

在开发复杂的单页应用&#xff08;SPA&#xff09;时&#xff0c;我们经常会遇到需要管理多个浮动窗口&#xff08;或称“弹窗”、“面板”&#xff09;的场景。一个核心的用户体验要求是&#xff1a;用户当前操作的窗口应该总是在最顶层。本文将结合代码示例&#xff0c;总结一…

集成算法和kmeans

一、集成算法&#xff08;Ensemble Learning&#xff09; 1. 基本概念 集成学习通过构建并结合多个学习器&#xff08;基分类器/回归器&#xff09;来完成学习任务&#xff0c;旨在通过集体决策提升模型性能&#xff0c;类似于“多个专家的综合判断优于单个专家”。 2. 结合策略…

图数据库性能与可扩展性评估

图数据库的性能与可扩展性直接决定业务场景&#xff08;如实时风控、知识图谱分析&#xff09;的落地效果&#xff0c;需结合业务场景特性&#xff08;OLTP/OLAP&#xff09;、技术指标&#xff08;响应时间、吞吐量&#xff09;和扩展能力&#xff08;数据量/节点扩展&#xf…

树莓派常用的国内镜像源列表以及配置方法

1. 常用的镜像源使用下来发现清华源经常访问不到&#xff0c;阿里源比较好用。其他源还未测试。源名称URL清华源https://pypi.tuna.tsinghua.edu.cn/simple阿里云https://mirrors.aliyun.com/pypi/simple/中科大https://pypi.mirrors.ustc.edu.cn/simple/华为云https://repo.hu…