UNITY 手游(安卓)如何使用C/C++代码

解决方案:将C/C++代码编译成so供C#代码调用。

SO生成工具:android studio,简称AS

一,so 生成方法:

1,菜单:File->New->New Project-> Native C++

2,编写C++导出函数

UNITY 手游(安卓)如何使用C/C++代码

3,菜单:Build->Select Build Variants,选择构建类型 Debug或Release

4, 菜单:Build->Make Project,等待构建完成,打开Project视图,cmake下可以找到生成的各种 so

UNITY 手游(安卓)如何使用C/C++代码

二,Unity中使用So

1,将生成的SO文件放入到UNITY的Plugins文件夹中,然后设置如下(每个so文件对应设置,arm64-v8a设置为ARM64,armeabi-v7a设置为ARMV7,X86设置为X86)

UNITY 手游(安卓)如何使用C/C++代码

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”{}中

UNITY 手游(安卓)如何使用C/C++代码

CPP实现如下:

UNITY 手游(安卓)如何使用C/C++代码

同时,修改CMakeLists.txt,如下

UNITY 手游(安卓)如何使用C/C++代码

二, 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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【C/C++】sscanf函数和正则表达式

    此文所有的实验都是基于下面的程序: char str[10]; for (int i = 0; i < 10; i++) str[i] = ‘!’; 执行完后str的值为 s…

    C++ 2023年5月29日
    045
  • 【转】C++的赋值构造函数(赋值运算符重载)

    当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值构造函数。 当没有重载赋值构造函数(赋值运算符)时,通过默认赋值构造函数来进行赋值操作 注意:这里a,b对象是已经存在的,…

    C++ 2023年5月29日
    048
  • Fixed width integer types (since C++11)

    越界问题非常频繁地困扰着开发人员 CPP常用的类型定义不能体现数据的bit位数,让开发人员非常抓狂,相信很多人都遇到过,当判定一个数值是否越界时候,一定是先去网上查表, 但是数据类…

    C++ 2023年5月29日
    071
  • EclipseC++学习笔记-10 warnings being treated as errors,,error: format ‘%u’ expects argument of type

    增加选项All Options增加-Wformat=0 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。另外建了几个QQ技术群:2、全栈技…

    C++ 2023年5月29日
    043
  • 解决c++中delete后内存系统不回收

    一般new出来的内存,delete掉后。 此时如果看top内存没有减少,则可以使用下面函数让系统强制回收。 #include malloc_trim(0); Original: h…

    C++ 2023年5月29日
    078
  • C++STL之双端队列容器

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/huashanqingzhu/p/12832819.ht…

    C++ 2023年5月29日
    061
  • A Complete Guide to Programming in C++ 笔记

    1.c++程序编译过程。包括两个阶段,compiler和linker。第一个阶段compiler是把c++文件编译成obj文件。第二个阶段是linker把多个obj文件和lib文件…

    C++ 2023年5月29日
    045
  • C++案例——协助破案

    协助破案。假设已经查清,有 A、B、C、D、E 五个嫌疑人可能参与制造了一起抢劫银行案,但不知道其中哪几个是真正的案犯。不过,有确凿证据表明: 上述论断可以用数理逻辑中的正规表达式…

    C++ 2023年5月29日
    044
  • C++ 知识点

    知识点 说明 所谓的引用就是给变量取一个别名,使一块内存空间可以通过几个变量名来访问。声明引用类型的变量需要在变量名前加上符号&,并且必须指定初值,即被引用的变量。 C++…

    C++ 2023年5月29日
    049
  • C++ CRTP

    CRTP 英:The curiously recurring template pattern (CRTP) is a C++ idiom in which a class X d…

    C++ 2023年5月29日
    085
  • Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

    在windows下使用pip安装包的时候提示报错:Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.ba…

    C++ 2023年5月29日
    081
  • clang-format 对 c++ 进行格式化

    在 VS Code 中安装了 C/C++ 插件后会自动带上格式化工具 clang-format。按 option+shift+f 即可对文件进行 format(格式化)。 在目录下…

    C++ 2023年5月29日
    072
  • C++11 static_assert

    1。assert是动态断言,运行期检查,影响性能,故debug版本检查,release关闭。 2。C++11中引入了static_assert这个关键字,用来做编译期间的断言,因此…

    C++ 2023年5月29日
    049
  • c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃…

    C++ 2023年5月29日
    052
  • 右值引用与转移语义(C++11)

    参考资料: 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的 左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对…

    C++ 2023年5月29日
    069
  • C++11 动态内存管理

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C+…

    C++ 2023年5月29日
    050
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球