解决方案:将C/C++代码编译成so供C#代码调用。
SO生成工具:android studio,简称AS
一,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();
goText.text = "准备调用\n";
int ret = -1;
try
{
ret = ABAdd(3, 4);
}
catch (Exception e)
{
goText.text += $"DLL调用出错, {e}\n";
}
if(ret > 0)
{
goText.text += $"调用完成, ret:{ret}\n";
}
}
}
三,打包为APK,安装到手机上测试。
因为SO文件只能在安卓上使用,所以在编辑器下运行会报 System.DllNotFoundException异常。
同理,DLL文件在编辑器下可以被调用,在安卓上会报异常。
——————————————————————进阶————————————————————————
一,如何将函数的定义与实现分开,分别放到.h和.cpp中。 实现如下(以KCP为例)
头文件如下,将所有需要导出的函数包在 extern “C”{}中
CPP实现如下:
同时,修改CMakeLists.txt,如下
二, so库文件的名字是在CMakeLists.txt中指定的,生成之后必须一直保持不变,否则程序识别不到。
如在android studio中生成的SO文件原名是 libkcp.so,将它放到另一工程后重命名为kcp.so,并在代码中引用如下
csharp;gutter:true;
[DllImport("kcp", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr ikcp_create(uint conv, void* user);</p>
<pre><code>
运行时就会报错:找不到kcp.so。正确使用名应是 libkcp,如下
;gutter:true;
[DllImport("libkcp", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr ikcp_create(uint conv, void* user);
Original: https://www.cnblogs.com/timeObjserver/p/14126920.html
Author: 时空观察者9号
Title: UNITY 手游(安卓)如何使用C/C++代码
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536225/
转载文章受原作者版权保护。转载请注明原作者出处!