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.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…