UNITY⼿游(安卓)如何使⽤CC++代码
解决⽅案:将C/C++代码编译成so供C#代码调⽤。
SO⽣成⼯具:android studio,简称AS
cmake如何使用
⼀,so ⽣成⽅法:
1,菜单:File->New->New Project-> Native C++
2,编写C++导出函数
3,菜单:Build->Select Build Variants,选择构建类型 Debug或Release
4,菜单:Build->Make Project,等待构建完成,打开Project视图,cmake下可以到⽣成的各种 so
⼆,Unity中使⽤So
1,将⽣成的SO⽂件放⼊到UNITY的Plugins⽂件夹中,然后设置如下(每个so⽂件对应设置,arm64-v8a设置为ARM64,armeabi-v7a设置为ARMV7,X86设置为X86)
2,编写C#,调⽤SO
using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class testdll : MonoBehaviour
{
[DllImport("libnative-lib", CharSet = CharSet.Ansi)]
public static extern int ABAdd(int a, int b);
void Start()
{
var goText = GameObject.Find("infotext").GetComponent<Text>();
< = "准备调⽤\n";
int ret = -1;
try
{
ret = ABAdd(3, 4);
}
catch (Exception e)
{
< += $"DLL调⽤出错, {e}\n";
}
if(ret > 0)
{
< += $"调⽤完成, ret:{ret}\n";
}
}
}
三,打包为APK,安装到⼿机上测试。
因为SO⽂件只能在安卓上使⽤,所以在编辑器下运⾏会报 System.DllNotFoundException异常。
同理,DLL⽂件在编辑器下可以被调⽤,在安卓上会报异常。——————————————————————进阶————————————————————————
⼀,如何将函数的定义与实现分开,分别放到.h和.cpp中。实现如下(以KCP为例)
头⽂件如下,将所有需要导出的函数包在 extern "C"{}中
CPP实现如下:
同时,修改,如下
⼆, so库⽂件的名字是在中指定的,⽣成之后必须⼀直保持不变,否则程序识别不到。
如在android studio中⽣成的SO⽂件原名是 libkcp.so,将它放到另⼀⼯程后重命名为kcp.so,并在代码中引⽤如下    [DllImport("kcp", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr ikcp_create(uint conv, void* user);
运⾏时就会报错:不到kcp.so。正确使⽤名应是 libkcp,如下
[DllImport("libkcp", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr ikcp_create(uint conv, void* user);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。