Unity Native Plugin C#和C++互相调用

news2024/11/18 7:45:22

官方链接

1.DLL的方式:

C++代码:编译成DLL,导入Unity

#pragma once
#include <map>
#include <string>

//导出宏定义
#define _DllExport _declspec(dllexport)

//函数指针
typedef void (*NativeCallback)(const char*);

extern "C"
{
	//注意这里字符串不能用C++的std::string,和C#的string不等价,等价的是char*,即字符数组
	_DllExport void RegisterNativeCallback(const char* functionName, NativeCallback callback);
	_DllExport void UpdateNative();
}

//缓存C#函数的地址
std::map<std::string, NativeCallback> _callbackMap;

//导出让C#调用,注册C#端的函数,注册后就可以在C++端调用C#的函数,本质就职把C#函数的地址给到C++,C++调用。
_DllExport void RegisterNativeCallback(const char* functionName, NativeCallback callback)
{
	_callbackMap[std::string(functionName)] = callback;
}

//导出让C#调用
_DllExport void UpdateNative()
{
	//调用C#端的函数,可以在Unity性能分析界面看到Native update,用此方法可以在Unity界面查看C++代码的耗时
	_callbackMap[std::string("BeginSample")]("Native update");
	_callbackMap[std::string("Log")]("Native Log");
	_callbackMap[std::string("EndSample")]("Native update");
}

C#代码:

using AOT;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Profiling;

namespace Haha
{
    public class TestCPPLib : MonoBehaviour
    {
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        delegate void NativeCallback(string args);

        [DllImport("CPPLib")]
        static extern void RegisterNativeCallback(string functionName, IntPtr callback);

        [DllImport("CPPLib")]
        static extern void UpdateNative();

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackLog(string args)
        {
            Debug.Log(args);
        }

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackBeginSample(string args)
        {
            Profiler.BeginSample(args);
        }

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackEndSample(string args)
        {
            Profiler.EndSample();
        }

        void Start()
        {
        	//调用C++函数,注册C#函数
            RegisterNativeCallback("Log", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackLog)));
            RegisterNativeCallback("BeginSample", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackBeginSample)));
            RegisterNativeCallback("EndSample", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackEndSample)));
        }

        private void Update()
        {
        	//调用C++函数
            UpdateNative();
        }
    }
}

2.还有一种是C++源码作为插件,只支持il2cpp。

C++代码:直接放到Unity的Assets目录下

C#源文件:区别只在导入时不写具体的文件名,写:__Internal即可,因为用IL2CPP 后端的方式,会把C++源文件放到工程内部一块编译。

using AOT;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Profiling;

namespace Haha
{
    public class TestCPPLib : MonoBehaviour
    {
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        delegate void NativeCallback(string args);
		
		//区别在这里:
        [DllImport("__Internal")]
        static extern void RegisterNativeCallback(string functionName, IntPtr callback);

        [DllImport("__Internal")]
        static extern void UpdateNative();

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackLog(string args)
        {
            Debug.Log(args);
        }

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackBeginSample(string args)
        {
            Profiler.BeginSample(args);
        }

        [MonoPInvokeCallback(typeof(NativeCallback))]
        static void CallbackEndSample(string args)
        {
            Profiler.EndSample();
        }

        void Start()
        {
            RegisterNativeCallback("Log", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackLog)));
            RegisterNativeCallback("BeginSample", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackBeginSample)));
            RegisterNativeCallback("EndSample", Marshal.GetFunctionPointerForDelegate(new NativeCallback(CallbackEndSample)));
        }

        private void Update()
        {
            UpdateNative();
        }
    }
}

如果只是查看C++代码的耗时,unity提供了C++的接口,更加方便,视频最后有介绍。
Unity官方手册有具体代码

关于IL2CPP打包的测试:
1.直接通过Unity构建,结构如下:如下:大小313M
在这里插入图片描述
2.通过创建VS解决方案(可以在VS里设置断点,修改调试C++代码),在VS里构建,在构建界面设置:
在这里插入图片描述
结构如下:bin目录包含软件的data目录,具体生成的exe在各自的平台下:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
最终把bin目录的data文件夹和对应平台的exe何在一起,如下:大小162M
在这里插入图片描述
上面的lib、pdb、exp可以删除,测试不影响运行,精简后的目录:大小50.8M
在这里插入图片描述
结论:用vs构建的体积更小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【28】C语言 | 关于指针练习(2)

目录 10、下列关于二维数组输出 11、下列关输出 12、下列代码输出什么 13、下列代码输出什么 14、下列代码输出什么 15、下列代码输出什么 16、下列代码输出什么 17、下列代码输出什么 18、杨氏矩阵 19、左旋转两个字符 10、下列关于二维数组输出 int main() {int …

文献阅读:Improving Language Understanding by Generative Pre-Training

文献阅读&#xff1a;Improving Language Understanding by Generative Pre-Training 1. 文章简介2. 模型介绍3. 实验考察 1. 训练数据2. 实验结果3. 消解实验 4. 总结 & 思考 文献链接&#xff1a;https://cdn.openai.com/research-covers/language-unsupervised/languag…

P1464 Function————C++

文章目录题目Function题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1解题思路Code运行结果题目 Function 题目描述 对于一个递归函数 w(a,b,c)w(a,b,c)w(a,b,c) 如果 a≤0a \le 0a≤0 或 b≤0b \le 0b≤0 或 c≤0c \le 0c≤0 就返回值$ 1$。如果 a>20a>20a&…

【Java】-【并发】

文章目录堆和方法区中的数据是可以被共享的堆中的数据是被栈中的变量所持用的&#xff0c;栈是线程隔离的&#xff0c;每个线程私有一个栈&#xff0c;所以栈中的数据不共享调用a方法时&#xff0c;jvm会给a方法创建一块内存区&#xff0c;让其入栈&#xff0c;这块区域被称为a…

linux(信号量)

信号量几个基本概念临界资源临界区原子性互斥信号量后台进程前台进程信号储存信号处理信号(信号捕捉)发送信号1、键盘产生&#xff1a;2、系统调用接口发送信号3、由软件条件产生信号4、硬件异常发送信号内核中的信号量**信号量在内核中的数据结构****信号集操作函数**信号的检…

YOLOv7 Falsk Web 监测平台 | YOLOv7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

电子技术——MOS管的小信号模型

电子技术——MOS管的小信号模型 在上一节&#xff0c;我们已经学习过了MOS管的基本线性放大原理&#xff0c;本节我们继续深入MOS管的小信号放大&#xff0c;建立MOS管的小信号模型。 我们本节继续使用上节的电路&#xff0c;如下图所示&#xff1a; DC偏置点 根据上节的知识…

2.单例模式,工厂模式,建造者模式,原型模式

单例模式 单例模式的优点&#xff1a; 处理资源访问冲突表示全局唯一类 实现单例的关键&#xff1a; 构造函数需要是 private 访问权限的&#xff0c;这样才能避免外部通过 new 创建实例&#xff1b;考虑对象创建时的线程安全问题&#xff1b;考虑是否支持延迟加载&#xff1b…

Deformable DETR TBD范式的不二选择

TBD范式检测和跟踪是不分家的。当前,性能较优的目标检测方法大都基于Transformer来做,CNN在目标检测的表现逐渐走低。DETR是基于Transformer的目标检测开山作,其解决了霸榜的yolo系列一些令人讨厌的事情,不需要前处理和后处理,做到了真正意义上的end to end: 前处理:Anc…

测试做得好,犯错少不了【30个最容易犯的错误】谨记

最近跟一些刚刚进入软件测试行业的朋友去交流&#xff0c;发现了一个有趣的现象&#xff0c;就是对于这个行业的很多问题的认识都是一致的片面&#xff0c;当然也可以理解为误区。自己利用一点时间&#xff0c;把他们对于这个行业的认识误区都罗列出来&#xff0c;然后结合自己…

Centos7搭建Hadoop集群(V3.3.4)

Centos7搭建Hadoop集群V3.3.4一、准备工作1、配置hostname2、hosts映射3、关闭防火墙4、同步时间5、关闭selinux6、配置ssh免密登陆7、重启二、安装所需环境1、jdk安装2、hadoop安装三、修改配置hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlworkers四…

web测试1:在ubuntu中运行boa

参考文档&#xff1a; https://blog.csdn.net/feit2417/article/details/84777523 1.下载boa源码 Boa Webserver主页&#xff1a;Boa Webserver 下载链接&#xff1a;http://www.boa.org/boa-0.94.13.tar.gz 下载后&#xff0c;解压 tar zxvf boa-0.94.13.tar.gz。 文件列表…

Mysql-query优化之explainProfiling

1、explain 要对执行计划有个比较好的理解&#xff0c;需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分&#xff0c;分别是 应用层、逻辑层、物理层&#xff0c;不只是MySQL &#xff0c;其他大多数数据库产品都是按这种架构来进行划分的…

Spring的快速入门代码实现

Spring的快速入门代码实现前言&#xff1a;需要创建Maven的项目&#xff08;这个一定要看下面的链接&#xff09;1.如何创建Maven项目直达链接2.将这个项目的名字 命名为spring_ioc一、导入坐标&#xff08;pom.xml文件中实现&#xff09;1.1 代码&#xff1a;1.2 version的版本…

【GD32F427开发板试用】从0开始到RTthread移植

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;军军 写在前面: 很高兴获得这次试用机会&#xff0c;一直很想了解国内ARM MCU的发展&#xff0c;尤其是GD32系列的MCU。我也成功获得了第一次使…

PyQt5开发环境搭建 1.2 简单的例子

目录 基本开发步骤 创建Eric6工程目录 使用Qt Creator创建Qt项目 创建项目 Kit Selection 打开编辑窗口 打开form 放一个Label 拖动Label 放一个Button 拖动Push Button 保存UI文件 编译ui文件 当前项目下文件列表 将ui文件编译成py文件 将ui文件和py文件拷贝到…

学习记录678@项目管理之合同管理案例

案例 系统集成商 Simple 公司与生产型企业 Perfect 集团签订了一份企业MIS(管理信息系统)开发合同&#xff0c;合同已执行到设计和开发阶段&#xff0c;由于 Perfect 集团内部组织结构调整可能会影响核心业务的流程。集成商 Simple 公司提出建议&#xff0c;合同暂停执行至新的…

使用 Jenkins + Gitee + maven 自动化部署 Spring Boot

目录 1、前言 1 .1、插件简介 1.2、插件安装 2、创建Maven项目 2.1、新建一个全新的项目 2.2、拷贝已有项目 3、项目配置 3.1 、General 3.2、源码管理 3.3、构建触发器 3.4、构建环境 3.5、Pre Steps 3.6、Build 1&#xff09;Root POM 2&#xff09;Goals and…

kubenertes集群部署kubeadm方式

一、安装要求 1、3台机器&#xff09;&#xff0c;操作系统Centos7,5.4内核,CentOS 7.x 系统自带的3.10.x内核存在一些Bugs.导致运行的Docker.Kubernetes不稳定。 2、硬件配置:4GB内存&#xff0c;至少2个CPU或更多CPU&#xff0c;至少硬盘30GB或更多 3、集群中所有机器之间网…

41 锚框【动手学深度学习v2】】

41 锚框【动手学深度学习v2】】 锚框&#xff1a;对边框位置的猜测。 先提出多个框在某个地方&#xff0c;比如5个&#xff0c;然后去看这5个框里面到底有没有物体。 两次预测&#xff1a;锚框位置和锚框内物体的预测。 如何处理锚框&#xff1f; IoU - 交并比 比较两个框之…