Unity与本地库交互

【在安卓平台上,Unity与C/C++编写的.so动态库交互的实现】 编写C++代码,并编译成Android.so库。在Unity中调用本地C++库,并通过P/Invoke调用C++函数。在Android端通过JNI与C#进行交互,确保Unity能够与本地C++库进行通信。通过上述步骤,我们成功地在Unity中与Android平台的.so使用Android Studio编写并编译C++代码为.so动态库。将.so库集成到Unity项目中的目录下。通过Unity的和与JNI方法交互,调用C++中的函数。通过Unity脚本实现回调,获取并显示C++返回的数据。 阅读详情

介绍

 

公共语言基础设施(CLI)的目的是使它“容易”与现有代码进行互操作。原则上,所有您需要做的就是创建一个函数声明DllImport为现有的代码来调用,运行时将处理其余的。例如:

 

[DllImport ("libc.so")]

 privatestaticexternint getpid ();

请注意,大多数的类和枚举提到在这个文档保存在System.Runtime.InteropServices namespace.

 

上面的c#函数声明将调用POSIX getpid(2)系统调用的平台上有 libc.so库

如果libc.so存在但getpid没有输出, 抛出一个EntryPointNotFoundException异常。如果libc.so不能加载, 抛出一个DllNotFoundException异常。简单,直接。有什么能比这更容易?

 

 

有三个问题

 

1     在DllImport语句指定库。

2     确定实际调用哪个函数。

3     传递参数,大多数现有的代码更复杂。字符串需要被传递,结构可能需要被传递,内存管理实践也将参与……

 

现有的代码是一个复杂的怪兽,和互操作层需要支持这种复杂性。

 

库处理

 

如何在运行时发现,并指定在DllImport属性中?这个问题本质上是特定于平台的。

 

 

Windows DLL搜索路径

 

从MSDNLoadLibrary文档,dll程序所需的是按照下面的顺序进行搜索:

1. 应用程序加载的目录。

2. 当前目录

3. 系统目录,使用GetSystemDirectory()函数来获得这个目录的路径。

4. 16位系统目录。

5. Windows目录。使用GetWindowsDirectory()函数来获得这个目录的路径。

6. PATH环境变量中列出的目录。

 

 

当然,现实并没有那么简单。实际上,“system”目录实际上是%WINDIR%\system32,除了Windows9x平台%WINDIR%\system。16位系统目录通常%WINDIR%\system,但不被视为一个单独的搜索目录在Windows 9 x平台。

 

此外,在Windows Server 2003和Windows XP SP1, 注册表入口HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SafeDllSearchMode改变上述命令, 如果这是1(默认),然后搜索当前目录是在系统和Windows目录。这是一个安全特性(它可以防止木马库被载入代替,例如,OLE32.DLL) 但它把上面的列表改为:1、3、4、5、2、6。

 

Linux共享库搜索路径

 

从dlopen(3)手册页,必要的程序所需的共享库是按照下面的顺序进行搜索:

 

1在用户的LD_LIBRARY_PATH 环境变量中以冒号分隔的目录列表.这是一个经常使用的方法,允许本地共享库是一个CLI程序发现的。

2库的列表,缓存在/etc/ld.so.cache. /etc/ld.so.cache是由编辑/etc/ld.so.conf和运行ldconfig. 编辑/ etc/ld.so.conf首选方法是搜索附加目录,而不是使用LD_LIBRARY_PATH, 因为这是更安全的(很难达到一个木马库到/ etc/ld.s.cache比插入到LD_LIBRARY_PATH)。

3 / lib,紧随其后的是/ usr / lib。

作为一个mono的扩展, 如果一个库正被加载是__Internal,然后主程序是寻找方法符号。这相当于调用dlopen(3)和一个文件名的空。这允许您P / Invoke方法,都在一个应用程序嵌入Mono。

 

 

Mac OS X框架和.dylib搜索路径

框架和库搜索路径是:

1在用户的DYLD_FRAMEWORK_PATH环境变量中以冒号分隔的目录列表.

2在用户的 DYLD_LIBRARY_PATH环境变量中以冒号分隔的目录列表.

3在用户的 DYLD_FALLBACK_FRAMEWORK_PATH 环境变量中以冒号分隔的目录列表.它是默认目录:

·        ~/Library/Frameworks

·        /Library/Frameworks

·        /Network/Library/Frameworks

·        /System/Library/Frameworks

4在用户的 DYLD_FALLBACK_LIBRARY_PATH 环境变量中以冒号分隔的目录列表, 它是默认目录:

·        ~/lib

·        /usr/local/lib

·        /lib

·        /usr/lib

注意:使用GLib,Mono加载库, 还有在Mac OS X上GLib有bug不使用,..dylib扩展,而是使用Unix.so extension,虽然这应该最终被修复, 目前的解决方法是写一个.config文件映射到.dylib文件

<configuration>

  <dllmapdll="mylib"target="mylib.dylib"/>

 </configuration>

TODO:将mono同时支持框架和dylibs吗?

 

 

 

库名:

知道到哪里查找库是只有一半的问题。了解库的加载是另一半。

不同的平台有不同的命名约定。Windows平台上是库名.dll,如OLE32.DLL等。Linux平台使用lib前缀和一个.so后缀。MacOSX平台使用lib前缀和一个.dylib后缀。除非他们是一个框架,在这种情况下,他们是一个目录,事情变得更加复杂。

 

 

 

 

TextMeshPro源码移植-替换掉PackageManager(修改Unity本地库源码) TextMeshPro自定义代码入门 阅读详情

相关推荐

Unity集成MediaPipe:零代码实现AI手势识别与交互开发

计算机视觉作为人工智能的核心分支,通过算法让机器“看懂”图像与视频。其基本原理涉及图像处理、特征提取与模式识别,最终实现物体检测、姿态估计等功能。这项技术的价值在于将高维视觉信息转化为结构化数据,为交互应用提供感知基础。在游戏开发、AR/VR、智能交互等领域,实时视觉感知能极大增强用户体验。MediaPipe作为谷歌开源的跨平台视觉AI框架,通过预置模型与模块化流水线,将复杂的模型部署简化为即插即用的组件。结合Unity引擎,开发者无需深入底层AI技术,即可快速集成手部追踪、姿态估计等能力,实现如手势控制、

weixin_34384681的博客 338

Untiy_外部引入类库

想要导入到unity内的类库需要放在特殊文件夹Plugins下。 导入之后,Unity就自动添加了这些类库。 关于类库生成时,需要将C#的目标框架版本降到.NET 2.0 ,因为unity本身框架最高为2.0 ,且低版本不会适配高版本。 ...

wy小骑士 704

Unity集成MediaPipe实战:本地视觉AI与手势交互开发指南

计算机视觉作为人工智能的核心分支,通过算法让机器理解图像与视频内容。其原理涉及特征提取、模式识别和深度学习模型推理,技术价值在于为应用赋予环境感知能力。在游戏开发、XR交互和数字孪生等应用场景中,实时、低延迟的视觉处理尤为关键。MediaPipe作为Google推出的跨平台机器学习框架,专为实时感知任务优化,提供手部追踪、姿态估计等预构建解决方案。通过集成MediaPipe,Unity开发者可在本地设备实现高效的手势识别与物体检测,无需依赖云端服务,有效保障数据隐私并降低延迟。本文聚焦Unity与Media

weixin_34342207的博客 319

Ubuntu环境下使用Unity3D调用C++编写的Linux so动态链接库

Unity3D已经有了支持Linux的社区版本。要在Linux环境下开发Unity3D程序,首先要安装Linux版的Unity。地址如下: https://forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/#post-2556301 1 制作Linux下的动态链接库 Linux下的

雁回晴空的博客专栏 7835

UnityResolve.hpp:C++与Unity运行时交互的统一解决方案

在游戏开发与逆向工程领域,跨语言交互是一个常见的技术挑战,尤其是在需要从C++侧操作Unity游戏中的C#对象时。其核心原理在于通过封装Unity的运行时接口,构建一个统一的抽象层来屏蔽Mono和IL2CPP两种脚本后端的差异。这项技术的价值在于,它将原本需要深入理解内存布局和手动计算偏移量的复杂过程,简化为一套类型安全、直观的C++ API,极大地提升了开发效率和代码的可维护性。其应用场景广泛,包括游戏模组开发、自动化测试工具构建、性能分析以及深度调试等。本文聚焦的UnityResolve.hpp库,正是

cqwmy840702的博客 357

Unity语音识别实战:基于Vosk的本地STT方案与流式交互实现

语音识别(Speech-to-Text,STT)作为人机交互的核心技术,其原理是将音频信号转化为文本信息,涉及声学模型、语言模型等关键技术。这项技术在人机界面、智能助手、虚拟现实等领域具有重要价值,能够实现自然流畅的语音交互体验。在游戏开发与交互应用场景中,离线、低延迟的本地STT方案尤为关键,它解决了网络依赖、隐私安全和持续成本等问题。本文聚焦于Unity引擎,通过集成Vosk这一基于Kaldi的开源本地STT引擎,构建了一套完整的语音识别解决方案。方案采用客户端-服务端架构,Unity负责音频采集与交互

weixin_33733810的博客 364

设置 LD_LIBRARY_PATH 变量

在 Linux 下,如果你写好了自己的动态链接库,需要在其它程序里调用,则需要让这些程序能找到这些动态链接库。如果设置不对,会出现类似如下的错误: test: error while loading shared libraries: libexampleso.so.0: cannot open shared object file: No such file or directory

tianmo2010的专栏 1901

Unity串口通信实战:基于System.IO.Ports的硬件交互与数据解析

串口通信是计算机与外部硬件设备进行数据交换的基础技术之一,它通过串行接口实现设备间的稳定、可靠通信。其核心原理在于通过特定的波特率、数据位、停止位和校验位等参数配置,确保数据在物理线路上的准确传输。在工业控制、物联网和嵌入式开发等领域,串口通信是实现上位机软件与传感器、控制器等硬件设备交互的关键技术。对于使用Unity引擎进行跨平台内容开发的工程师而言,掌握串口通信能力,能够将虚拟仿真与现实硬件深度结合,拓展应用边界。例如,在数据监控与可视化场景中,Unity可以实时接收并解析传感器数据,驱动三维场景动态变

weixin_33965305的博客 475

目录搜索Unity与本地库交互

题记:写这篇博客要主是加深自己对目录搜索的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。     介绍           公共语言基础设施(CLI)的目标是使它“容易”与现有代码进行互操作。原则上,所有您需要做的就是创立一个函数声明DllImport为现有的代码来调用,运行时将处置其余的。例如:            [DllImport ("libc.so"...

weixin_34342578的博客 116

Unity与Android交互及SO库打包实战指南

Java Native Interface(JNI)是Java平台的一部分,提供了一种机制让Java代码与其他语言编写的代码进行交互,尤其是C和C++代码。通过JNI,Java应用程序可以调用本地应用程序接口(API)库中的函数,或者被这些库调用。JNI的使用让开发者可以在Java环境中利用已有的本地库,或者编写性能敏感部分的代码以本地代码形式运行,从而在保持跨平台优势的同时提升性能。

weixin_42522857的博客 1250

Unity连接SqlServer数据库库文件

Unity连接SqlServer数据库所必须的库文件内容,有助于打包出exe文件能够正确连接数据库进行操作

Unity精品Demo库构建指南:从筛选标准到实战应用

在Unity开发中,示例工程(Demo)是连接理论知识与工程实践的重要桥梁。一个高质量的Demo通过直观的代码实现和实时交互反馈,能够清晰展示特定技术点的核心原理,如资源管理、性能优化或平台适配。其技术价值在于将抽象概念转化为可运行、可调试的解决方案,帮助开发者跨越“知道”与“做到”的鸿沟,快速内化最佳实践。在实际应用场景中,开发者常面临UI适配、动画系统集成或第三方SDK接入等具体挑战,一个遵循单一职责、代码清晰且依赖明确的精品Demo能提供直接的参考。本文围绕Unity开发中的**Demo筛选标准**与

weixin_30791095的博客 330

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

Unity集成Ultraleap 3Di:实现高精度手势交互与物理抓取开发指南

手势交互作为人机交互的重要分支,通过计算机视觉与机器学习算法实时捕捉手部动作,将自然手势转化为数字指令。其技术原理基于多摄像头传感器融合与骨骼关节点追踪,能够实现毫米级精度的27个骨骼点实时重建。在技术价值上,手势交互摆脱了传统外设束缚,提供了更直观、沉浸的输入方式,尤其适用于需要高自由度操作的场景。在应用场景层面,该技术已广泛应用于VR/AR内容开发、数字孪生操作界面、体感游戏及工业仿真培训等领域。本文聚焦于Unity引擎中集成Ultraleap 3Di解决方案,详细解析如何通过SDK实现手部数据获取、自

weixin_33881140的博客 458

qmc5883p芯片坐标系方向定义

问题 最近一个项目用到qmc5883p, 然而确定磁力计方向的时候发现datasheet上写的不是很清楚, 并且example中还有一个设置方向的一步, 于是测试了芯片坐标方向并记录了下来; 该芯片和qmc5883L方向并不一致; 结果 qmc5883P的datasheet给出来如下说明, Y为笔者添加的; 但是这个方向是按照datasheet的example设置的结果: //Define the sign for X Y and Z axis qmc5883p_write_reg(0x2

时有限 4120

DIY必备:如何用N-MOS管搭建低成本DC有刷电机驱动电路(附原理图+避坑指南)

本文详细介绍了如何使用N-MOS管搭建低成本、高可靠性的DC有刷电机驱动电路。针对DIY爱好者,从核心原理、电路设计、元件选型到焊接调试,提供了完整的实战指南,并重点解析了续流二极管选型、栅极驱动设计等关键避坑要点,帮助读者成功驱动电机并确保电路稳定运行。

delta的博客 776

Unity集成视频和弦识别:进程通信与实时游戏交互实战

计算机视觉与音频信号处理是多媒体内容分析的核心技术领域,它们通过算法模型从图像和声音中提取结构化信息。其基本原理涉及特征提取、模式识别与机器学习,能够将非结构化的视听数据转化为可编程的语义信息。这项技术的价值在于为交互式应用提供了环境感知与内容理解能力,极大地拓展了人机交互的维度。在应用场景上,它广泛服务于智能监控、内容审核、辅助创作及互动娱乐等领域。本文聚焦于音乐表演视频分析这一具体场景,探讨如何利用类似Chord的专用工具进行实时和弦识别,并重点阐述了通过进程间通信(IPC)技术,特别是ZeroMQ,将

weixin_30512043的博客 389

海思HiMPP开发避坑指南:MMZ内存与系统内存傻傻分不清?一个例子讲透

本文深入解析海思HiMPP开发中MMZ内存与系统内存的关键差异与应用场景,帮助开发者避免常见的内存混淆问题。通过实际案例和性能对比,详细介绍了MMZ内存的特性和优化策略,提升多媒体处理效率。

weixin_30772105的博客 469

Unity集成MediaPipe实现低成本3D手势交互:从原理到多平台部署

手势识别作为人机交互的重要分支,其核心原理是通过计算机视觉算法从图像序列中检测、跟踪并理解手部动作。传统方案依赖深度摄像头或专用传感器,成本高且部署复杂。而基于机器学习的手势识别技术,通过训练模型从普通2D图像中推断3D关键点信息,实现了“以软代硬”的突破,大幅降低了技术门槛和硬件成本。这项技术的价值在于为VR/AR、移动应用、数字人交互和教育软件等领域提供了高性价比的交互解决方案。MediaPipe作为Google开源的跨平台机器学习框架,其MediaPipe Hands模型能实时输出21个手部关键点的3

cuanjingyue4687的博客 330

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6281

Windows上搭建OpenHarmony星闪开发环境:HiSpark Studio全流程指南

嵌入式开发中,环境搭建是项目启动的关键步骤。OpenHarmony作为开源操作系统,其构建体系依赖Python脚本和GN/Ninja工具链,对版本兼容性要求严格。星闪(NearLink)技术作为新一代短距无线通信方案,在时延、并发和抗干扰方面优势显著,广泛应用于智能家居、工业控制等场景。在Windows平台上,通过HiSpark Studio集成开发工具,开发者可高效完成代码编辑、编译、烧录与调试。然而,Python版本冲突、环境变量配置、驱动签名等问题常导致搭建失败。本文详细拆解从系统准备到编译验证的全流

weixin_32658257的博客 346

Unity三维手势交互实战:基于MediaPipe-UnityPlugin从配置到算法实现

计算机视觉中的手势识别技术,通过深度学习模型实时检测并定位手部关键点,是实现自然人机交互的核心原理。其技术价值在于将复杂的图像理解转化为结构化的坐标数据,为虚拟操控提供了高精度、低延迟的输入基础。在增强现实、体感游戏、虚拟培训等应用场景中,手势交互能极大提升沉浸感和操作直觉。本文聚焦于MediaPipe-UniityPlugin这一高效工具,它作为MediaPipe框架在Unity引擎中的桥梁,封装了完整的手部关键点检测管道,显著降低了在游戏和AR/VR项目中集成先进视觉功能的门槛。通过解析其本地化高性能的

weixin_34252686的博客 402

瑞数jsvmp算法还原流程讲解

​ 又是很久没写文章了,今天水一篇文章吧,鉴于之前有看到过别人的文章被警告的案例,所以这篇文章就仅写一下还原瑞数vmp的大概流程吧(仅记录下自己还原的思路)

博客 6608
上一篇: jni jstring 、char* 类型的转换
下一篇: Socket编程中select()的妙用
zxycode007
博客等级 码龄18年 53粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值