【001】Unity调用动态链接库dll和so

 ApolloAR

https://www.jianshu.com/p/f37bb72979a1

一、PC平台 (注:环境 VS2017+Unity2017.15f1 )

1)C# DLL

1、 创建类库文件,注意选择.NET不能大于3.5版本,因为Unity支持最多到.NET 3.5版本。

1、C#工程创建

2、如下图,创建一个Class1,包含一个公有方法MyAddFunc(),定义一个简单的加法运算。

2、创建类

3、 生成-生成CshapeDLL,编译生成.dll文件。这里会在 ..CshapeDLL\CshapeDLL\bin\Debug目录下生成CshapeDLL.dll和CshapeDLL.pdb两个文件。

3、生成C# dll

4、创建Unity工程,在Unity项目中创建Assets\Plugins目录,将上步中.dll文件拖入该目录下。

4、新建Unity工程

5、新建脚本LibTest.cs,拖拽至任意GameObject,如Main Camera。C# DLL的调用最为简单,可以在不添加任何中间操作的情况下直接使用,测试脚本如下:

5、测试脚本

6、运行、测试

6、运行测试

2)C++ DLL

使用C++编译的dll相比C#要略微复杂,步骤基本一致。

1、新建C++空项目工程

1、新建项目

2、创建cpp文件,内容如下。注意,须将x86改为x64。

2、创建cpp文件

3、右键项目,打开属性,在配置属性-常规-项目默认值-配置类型栏,选择动态库(.dll)。

3、选择配置类型

4、生成,将在CppDLL\x64\Debug目录下生成CppDLL.dll等5个文件。

4、DLL生成

5、将CppDLL.dll拖拽至Assets\Plugins目录下。

5、添加C++ DLL

6、修改脚本,添加C++ DLL的调用,此时需要声明DLL并添加[DLLImport]特性。

6、更新脚本

7、运行、测试

7、测试

二、Android平台 (注:环境 Android Studio3.2.1+ndk-r12b )

总体思想:首先通过Android Studio生成.so文件,然后在Unity中调用。由于Android开发用的是Java,需要用到NDK调用C++方法。

1、在Android Studio下新建项目,Target Android Devices根据实际情况选择,这里选择的是API19。

1、新建安卓项目

2、配置NDK环境,右键项目 -Open Module Settings-Android NDK Location。要求NDK最低版本r11及以上,这里用的是r12

2、配置NDK环境

3、配置完成后,根目录local.properties里面会多了NDK路径。

3、NDK路径

4、在根目录gradle.properties文件中增加android.useDeprecatedNdk=true,目的是为了向后兼容。

4、gradle.properties设置

5、在module下面的build.gradle下面加上ndk节点。

5、添加ndk节点

6、在Project视图下的 app->src->main->java子目录下,创建java类声明本地代码库,然后定义native方法,jni接口需要native关键字来修饰

6、声明本地代码库

7、在main文件下新建jni文件夹,在该文件夹下新建Android.mk、Application.mk、helloworld.cpp、helloworld.h四个文件。头文件定义方法,cpp文件具体实现。Android.mk文件指定so名称、引用头文件目录和需要编译cpp文件。Application.mk说明用到的模块(静态库或动态库)和所用的API版本。

7.1 Android.mk

7.2 Application.mk

7.3 AndySo.h

7.4 AndySo.cpp

8、在File下选择Link C++ Project with Gradle,将Android.mk文件与项目关联。

8、 关联Android.mk

9、编译(Make Project(Ctrl+F9)),在app->build->intermediates->ndkBuild->debug->obj->local->armeabi-v7a->objs-debug目录下会生成libAndySo.so

9、编译so库

10、转到Unity,在Assets->Plugins目录下新建文件夹Android,并将libAndySo.so拖拽到文件夹下。

10、添加so库

11、更新脚本文件,.so文件和C++ DLL的调用方法类似。不过此时需要发布到安卓端进行测试,直接在PC调试会有DllNotFoundException的报错。为了在安卓端直观看到输出,这里利用OnGUI函数将相关信心输出到屏幕。

11、更新脚本

12、Unity发布到Android设备,注意修改Package Name。

 

12.1 Unity发布到Android

12.2 Android端输出效果

三、多平台适应

安卓端打包发布才能运行不利于调试效率,通过添加编译条件可以实现多平台适应。这里的前提是已经准备好外部库。平台的转换可以在File->Build Settings处调整,选择平台之后不要忘记点击“Switch Platform”进行转换。 以此处的C++ DLL和Android so为例,如下

脚本调整

PC端

Android端

关于 Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android 的解决方法:

[下载缺失库] https://blog.csdn.net/qq_24118527/article/details/82867864

[修改配置] https://blog.csdn.net/vocanicy/article/details/83004626

Unity调用动态链接库dll和so相关推荐

  1. 制作和unity调用动态链接库dll文件

    首先用vc建立一个dll工程 然后在里面建立一个testunity.h文件.内容如下 1 extern "C" int _declspec(dllexport)testunity( ...

  2. VC++6.0如何创建与调用动态链接库(dll)

    VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库.MFC规则DLL和MFC扩展DLL.DLL导出函数(或变量.类)可供应用程 ...

  3. Matlab调用动态链接库DLL文件

    环境:vs2015.Matlab2020 VS2015中建立工程, 建立工程如下两图所示 在头文件和源文件中分别添加头文件和源文件(代码如下所示) 头文件matdll.h文件 #pragma once ...

  4. Qt生成调用动态链接库dll

    把编译好的包含函数和变量的目标代码存储到文件中,在链接的时候让链接程序自动从文件中查找需要的代码.这个文件就是链接库,又可以分为静态链接库和动态链接库. 1. 静态链接库 链接程序从库中寻找需要的符号 ...

  5. Windows 下 JNI 调用动态链接库 dll

    1. Java调用本地代码常见的两种方案 JNI JNI(Java Native Interface),有过不同语言间通信开发经历的一般都知道,它允许java和其他语言代码(尤其是C/C++)进行交互 ...

  6. 使用Matlab调用动态链接库dll

    1.下载.安装和配置环境变量MinGW-w64 C/C++ 1.1 下载网址 http://tdm-gcc.tdragon.net/download 1.2 默认地址安装 1.3 配置环境变量 新建系 ...

  7. 【专题】C#调用动态链接库DLL

    1.概述 动态链接库(Dynamic Linked Library):将写好的函数存在库中,以供其他程序开发调用,调用方式为"动态的".  Windows为应用程序提供了丰富的函数 ...

  8. Python调用动态链接库DLL文件

    目录 方法一.ctypes库方式 方法二.shell方式 方法一.ctypes库方式 使用ctypes库调用.这个方法网上一搜都是. import ctypes obj = ctypes.WinDLL ...

  9. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

    静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...

最新文章

  1. WebShell代码分析溯源(第1题)
  2. FFMPEG结构体分析之AVCodecContext
  3. 如何使用windbg查看C#某个线程的栈大小 ?
  4. (王道408考研操作系统)第二章进程管理-第一节2:进程状态及其切换
  5. linux中SPI相关API函数,linux spi驱动开发学习(一)-----spi子系统架构
  6. QT 使用QModbus类实现modbus TCP踩过的坑
  7. clustalw2 使用简介
  8. 微信点餐系统01——环境搭建
  9. 关于使用群晖系统创建音乐外链的研究
  10. 台式计算机默认关机变注销,Win7电脑点关机变成注销怎么办?
  11. Java 核心技术专题
  12. naming conflicts with other components【vue3】
  13. 【从零开始学极狐gitlab】07作业关键字allow_failure、when、timeout(二) #JIHULAB101
  14. linux空格键命令,linux 命令(快捷键)
  15. Java新人之路 -- 集合(上)
  16. android 音量按键,Android 音量键的监听
  17. linux字体技术原理
  18. C#人脸识别、人脸68特征点识别
  19. office安装出现了“office对安装源的访问被拒绝30068-4(5)”错误
  20. PWE3故障处理流程

热门文章

  1. 用c 语言写出五子棋的代码,C语言案例:控制台版本的五子棋游戏【代码】
  2. H5中 video 使用border-radius失效解决方法
  3. Vue-cli 3.0+ 设置接口代理 设置vue.config.js的配置项
  4. 搜狗输入法电脑版_年终福利 | 安卓可用的输入法皮肤 搜狗篇 / 近期日程 | iOS智能深色版。...
  5. 平衡二叉树——Balance Binary Sort Tree 设计与实现
  6. Nginx负载均衡,ssl原理,生成ssl密钥对,Nginx配置ssl
  7. mysql建表的字段类型和约束条件
  8. Linux命令解释之yum
  9. 《Effective Debugging:软件和系统调试的66个有效方法》——导读
  10. android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题...