【Unity 與c++通信】Unity與c++通信注意事項,參數傳遞

一、在Unity中使用c++代碼

Unity想調用C++代碼,則需要c++開發人員打包成so庫。
在Unity中通過DllImport,和dll一樣調用。

需要注意的點:
C++代碼需要extern"C"來封裝成dll
因為unity默認使用c語言調用外部接口,會對c++代碼進行命名矯正,使用extern"C"避免這個問題。
so在Unity中的存放路徑為Plugins/Android/Libs/arm64-v8a

二、參數傳遞

1.結構體需對照數據類型創建。
2.參數個數和格式要一一對應,int16使用short,int32使用long, int8使用byte。
3.結構體數組,在向so傳遞時,使用IntPtr

三、調用用例,添加回調

回調方法需要添加聲明[UnmanagedFunctionPointer(CallingConvention.cdecl)]

[DlLImport(dlName:"soTest",CallingConvention = CallingConvention.Cdect)]publi static extern bool soMethod(string str, string num, Callback callBack);
[UnmanagedFunctionPointer(CallingConvention.cdecl)]
public delegate void Callback(string msg);

四、傳遞結構體數組情況

1. 結構體定義與內存對齊??

??C++端??:
cpp
#pragma pack(push, 1) // 強制1字節對齊,避免編譯器填充字節[1,9](@ref)
struct MyStruct {int id;float value;char name[32]; // 固定長度字符數組
};
#pragma pack(pop)// 導出函數聲明(確保符號可見)
extern "C" __attribute__((visibility("default"))) 
void ProcessStructArray(MyStruct* arr, int size);
??C#端??:
csharp
[StructLayout(LayoutKind.Sequential, Pack = 1)] // 與C++內存布局一致[1,9](@ref)
public struct MyStruct {public int id;public float value;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] // 固定長度字符串映射[4,11](@ref)public string name;
}

2.C#端分配非托管內存并傳遞??

csharp
[DllImport("MyLib", CallingConvention = CallingConvention.Cdecl)]
public static extern void ProcessStructArray(IntPtr structArray, int size);void SendData() {MyStruct[] data = new MyStruct[3];// 填充數據...// 分配非托管內存int structSize = Marshal.SizeOf(typeof(MyStruct));IntPtr buffer = Marshal.AllocHGlobal(structSize * data.Length);// 逐個復制結構體到內存[1,5](@ref)for (int i = 0; i < data.Length; i++) {IntPtr ptr = new IntPtr(buffer.ToInt64() + i * structSize);Marshal.StructureToPtr(data[i], ptr, false);}// 調用C++函數ProcessStructArray(buffer, data.Length);// 釋放內存(必須手動釋放)Marshal.FreeHGlobal(buffer);
}

3. C++端接收并處理數據??

??

cpp
void ProcessStructArray(MyStruct* arr, int size) {for (int i = 0; i < size; i++) {MyStruct& s = arr[i];// 修改數據(如數值運算)s.value *= 2.0f;printf("ID: %d, Name: %s\n", s.id, s.name);}
}

4.??關鍵注意事項??

??內存對齊問題??
C#必須使用[StructLayout(LayoutKind.Sequential, Pack = 1)],
C++需用#pragma pack強制對齊,確保雙方結構體大小和字段偏移一致。

驗證工具:通過Marshal.OffsetOf(typeof(MyStruct), “field”)檢查偏移量。

??字符串處理??

C#字符串需用[MarshalAs(UnmanagedType.ByValTStr)]映射為固定長度字符數組,避免C++端緩沖區溢出。
??函數導出與平臺差異??

Linux/Mac的.so庫需以lib前綴命名(如libMyLib.so),C#的DllImport需省略前綴。
使用nm -D libMyLib.so檢查導出符號是否存在。
??內存管理??
??必須顯式釋放??:Marshal.AllocHGlobal分配的內存需調用FreeHGlobal,否則導致內存泄漏。
避免野指針:傳遞完成后C++不應保留對內存的引用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80404.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek+Mermaid:輕松實現可視化圖表自動化生成(附實戰演練)

目錄 一、引言&#xff1a;AI 與圖表的夢幻聯動二、DeepSeek&#xff1a;大語言模型新星崛起2.1 DeepSeek 全面剖析2.2 多場景應用示例2.2.1 文本生成2.2.2 代碼編寫 三、Mermaid&#xff1a;代碼式圖表繪制專家3.1 Mermaid 基礎探秘3.2 語法與圖表類型詳解3.2.1 流程圖&#x…

霍格軟件測試-JMeter高級性能測試一期

課程大小&#xff1a;32.2G 課程下載&#xff1a;https://download.csdn.net/download/m0_66047725/90631395 更多資源下載&#xff1a;關注我 當下BAT、TMD等互聯網一線企業已幾乎不再招募傳統測試工程師&#xff0c;而只招測試開發工程師&#xff01;在軟件測試技術棧迭代…

【Python數據庫編程實戰】從SQL到ORM的完整指南

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現案例1&#xff1a;SQLite基礎操作案例2&#xff1a;MySQL連接池案例3&#xff1a;SQLAlchemy ORM …

第1講|R語言繪圖體系總覽(Base、ggplot2、ComplexHeatmap等)

目錄 第1講|R語言繪圖體系總覽 ? 引言:為什么R繪圖如此重要? ?? 1. Base繪圖系統 ?? 2. ggplot2生態系統 ?? 3. ComplexHeatmap超級熱圖系統 ?? 4. 其他特色繪圖庫(快速了解) ?? 小結一句話 ?? 預告下一講 第1講|R語言繪圖體系總覽 (Base、ggplot…

銀行卡歸屬地查詢的快速入門:API接口性能與安全兼備的高效實現

在金融和支付領域&#xff0c;獲取銀行卡的歸屬信息是一個常見的需求。**萬維易源提供的“銀行卡歸屬信息查詢”API為開發者和企業提供了高效、便捷的銀行卡信息查詢服務&#xff0c;可以通過簡單的接口調用獲取銀行卡的歸屬地、銀行名稱、電話號碼、網址、卡種、銀聯Luhn效驗和…

如何把兩個視頻合并成一個視頻?無需視頻編輯器即可搞定視頻合并

在日常生活中&#xff0c;我們經常需要將多個視頻片段合并成一個完整的視頻&#xff0c;例如制作旅行記錄、剪輯教學視頻或拼接短視頻素材。簡鹿視頻格式轉換器是一款功能強大的工具&#xff0c;不僅可以進行視頻格式轉換&#xff0c;還支持視頻合并功能。以下是使用簡鹿視頻格…

Android-KeyStore安全的存儲系統

? 在 Android 中&#xff0c;AndroidKeyStore 是一個安全的存儲系統&#xff0c;用于存儲加密密鑰。它提供了一種安全的方式來生成、存儲和管理密鑰&#xff0c;而無需將密鑰暴露給應用程序本身。以下是如何使用 AndroidKeyStore 的基本步驟和示例代碼。 檢查 AndroidKeyStor…

YOLOv12 改進有效系列目錄 - 包含卷積、主干、檢測頭、注意力機制、Neck上百種創新機制 - 針對多尺度、小目標、遮擋、復雜環境、噪聲等問題!

&#x1f525; 在 YOLO 系列一路狂飆之后&#xff0c;YOLOv12 帶來了令人耳目一新的范式轉變——它不再以 CNN 為絕對核心&#xff0c;而是首次 圍繞注意力機制構建 YOLO 框架&#xff0c;在保證實時性的前提下&#xff0c;將檢測精度再次推向新高度&#xff01; 為了進一步探…

網絡準入控制系統:2025年網絡安全的堅固防線

在當今數字化時代&#xff0c;網絡安全已成為至關重要的議題。陽途網絡準入控制系統作為保障網絡安全的關鍵機制&#xff0c;發揮著不可替代的作用。 陽途網絡準入控制系統核心目的在于確保只有合法、合規的設備與用戶能夠接入網絡。從本質上講&#xff0c;它通過一系列技術手段…

Graph Database Self-Managed Neo4j 知識圖譜存儲實踐2:通過官方新手例子入門(未完成)

官方入門例子&#xff1a;neo4j-graph-examples/get-started: An introduction to graph databases and Neo4j for new users 官方例子倉庫&#xff1a;https://github.com/neo4j-graph-examples 下載數據 git clone https://github.com/neo4j-graph-examples/get-started …

百度搜索AI開放計劃:助力開發者通過MCP Server連接用戶和應用

百度搜索AI開放計劃&#xff1a;助力開發者通過MCP Server連接用戶和應用 一、背景 2025年4月25日&#xff0c;百度在Create開發者大會上發布了全新的AI開放計劃。這一計劃的核心目的是實現用戶和AI應用、MCP Server的高效鏈接&#xff0c;提供更流暢的互動體驗&#xff0c;推…

方案精讀:77頁2024 集團企業IT技術架構規劃方案【附全文閱讀】

本文概述了集團企業2024年度IT技術架構規劃方案的首課&#xff0c;旨在通過TOGAF企業架構框架方法論&#xff0c;系統規劃并優化技術架構。項目核心目標在于結合集團信息化建設愿景與當前技術架構現狀&#xff0c;制定前瞻性、標準化的技術架構規劃及發展策略&#xff0c;以支撐…

C++ 日志系統實戰第三步:熟悉掌握各種設計模式

全是通俗易懂的講解&#xff0c;如果你本節之前的知識都掌握清楚&#xff0c;那就速速來看我的項目筆記吧~ 相關技術知識補充&#xff0c;也是最后的補充知識了~ 下文將加入項目代碼編寫&#xff01; 目錄 設計模式 單例模式 餓漢模式 懶漢模式 工廠模式 簡單…

開源作業調度框架Quartz框架詳細使用說明

Quartz框架詳細使用說明 Quartz 是一個功能強大的開源作業調度框架&#xff0c;廣泛用于在Java應用程序中執行定時任務。以下是Quartz框架的詳細使用說明、完整代碼示例、同類框架對比以及總結表格。 1. Quartz框架概述 特點&#xff1a; 靈活的調度&#xff1a;支持多種調度方…

Java實現背景圖片加自適應水印圖片

由于每張圖片的寬高比例不一致&#xff0c;希望使得水印在每張圖上的尺寸可以跟隨背景圖變化&#xff0c;自動調整水印大小。避免每張背景的圖所顯示的logo水印不至于那么突兀。 一、導入所需Jar包 <dependency><groupId>cn.hutool</groupId><artifactId…

代理ip和實際ip的區別和聯系

在互聯網時代&#xff0c;IP地址是每個設備連接網絡的“身份證”&#xff0c;但你是否知道IP地址還分為?代理IP?和?實際IP?&#xff1f;它們各自扮演什么角色&#xff1f;為什么有人選擇使用代理IP&#xff1f;實際IP又有哪些不可替代的作用&#xff1f;本文將深入解析代理…

mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 類的詳細解析

以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy 類的詳細解析&#xff1a; 1. 類的作用 MybatisMapperProxy 是 MyBatis-Plus 框架中用于實現 Mapper 接口動態代理的核心類。它繼承自 MyBatis 的 MapperProxy&#xff0c;并擴展了以下功能&#xff1a; …

Memcached 主主復制架構搭建與 Keepalived 高可用實現

實驗目的 掌握基于 repcached 的 Memcached 主主復制配置 實現通過 Keepalived 的 VIP 高可用機制 驗證數據雙向同步及故障自動切換能力 實驗環境 角色IP 地址主機名虛擬 IP (VIP)主節點10.1.1.78server-a10.1.1.80備節點10.1.1.79server-b10.1.1.80 操作系統: CentOS 7 軟…

如何成功防護T級超大流量的DDoS攻擊

防護T級超大流量的DDoS攻擊需要綜合技術、架構與運營策略的多層次防御體系。以下是基于最新技術實踐和行業案例總結的關鍵防護策略&#xff1a; 一、流量清洗與分布式處理 部署流量清洗中心 T級攻擊的核心防御依賴于專業的流量清洗技術。通過部署分布式流量清洗集群&#xff0c…

基于SpringAI Alibaba實現RAG架構的深度解析與實踐指南

一、RAG技術概述 1.1 什么是RAG技術 RAG&#xff08;Retrieval-Augmented Generation&#xff09;檢索增強生成是一種將信息檢索技術與生成式AI相結合的創新架構。它通過以下方式實現智能化內容生成&#xff1a; 知識檢索階段&#xff1a;從結構化/非結構化數據源中檢索相關…