当前位置: 首页 > news >正文

C ++代码学习笔记(一)

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.dtcms.com/a/343259.html

相关文章:

  • Layui 中的 iframe 详解与最佳实践
  • Linux笔记7——shell编程基础-1
  • SMT车间如何通过防静电监控系统提升产品质量
  • 206.反转链表
  • 【时时三省】vectorCAST 便捷使用技巧
  • 利用 Python 爬虫获取淘宝商品评论实战指南
  • 并发编程原理与实战(二十五)手写简易线程池实战,剖析线程状态转换过程
  • 【LINUX网络】UDP协议基础原理
  • Netty AdaptiveRecvByteBufAllocator原理详解
  • 分布式消息队列技术(原理相关):Kafka
  • 机器学习3
  • 《WINDOWS 环境下32位汇编语言程序设计》第6章 定时器和Windows时间
  • Git 版本控制核心流程与协作指南(从入门到冲突解决)
  • windows下jdk环境切换为jdk17后,临时需要jdk1.8的处理
  • 机器学习笔试题
  • 如何利用淘宝API接口实现自动下单?实战案例讲解
  • 【无标题】GAP: 用文本指导对任何点云进行高斯化(ICCV 2025)
  • 香港云服务器被暴力破解的危害有多大?
  • 使用docker manifest制作本地多架构镜像
  • Java与Vue深度融合,构建资产设备全周期管理系统,集成移动端实时操作与后台智能管理,功能完备且附完整源码,助力企业实现资产数字化高效运维
  • ChatBI如何重塑企业数据分析?2025年智能BI行业趋势解读
  • 使用 TensorBoardX 实现 PyTorch 神经网络可视化:从入门到进阶
  • Chrome 插件开发实战:从入门到进阶
  • Python 面向对象编程入门:从思想到属性操作
  • PyTorch 环境配置
  • Telnet、ftp详解
  • 教育场景下禁用html5播放器拖动进度条的例子
  • python 项目编号 2025821 有关于中英文数据的收集、处理
  • mac的m3芯片通过Homebrew安装git
  • ES_分词