栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Unity与 SO 交互 ☀️| 详细讲解 Unity端使用C# 调用so文件的具体方法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity与 SO 交互 ☀️| 详细讲解 Unity端使用C# 调用so文件的具体方法

本文章是Unity与 SO 交互的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————订阅专栏
就可以免费观看多篇相关内容的文章啦!

目录
        • 前言
    • Unity 使用C#调用so文件
        • 第一步:准备好生成so文件的源文件
        • 第二步:在Android Studio中生成so文件
        • 第三步:在Unity端调用so文件中的方法
    • 总结


前言

前面写过两篇文章介绍了 so文件的基本概念 和 怎样生成一个so文件

那这篇我们就来介绍一下拿到so文件之后在Unity端到底该如何调用呢!


Unity 使用C#调用so文件 第一步:准备好生成so文件的源文件

一般来说so文件都是已经提供好的,我们做项目的时候用到的时候直接拿过来用就好了

毕竟不是人人都是全栈,啥都能搞~

那我们既然学会了怎样生成一个so文件,那就来自己搞一个,然后放到Unity中进行交互调用吧!

首先准备几个生成 so 的两个源文件NaviteCode.h和 NaviteCode.cpp

NaviteCode.h 代码

#ifndef __NativeCode_H__
#define __NativeCode_H__

#if 0
#define EXPORT_DLL __declspec(dllexport) //导出dll声明
#else
#define EXPORT_DLL
#endif

extern "C" {
	EXPORT_DLL int MyAddFunc(int _a, int _b);
	EXPORT_DLL char* GetPkey();
}

#endif

NaviteCode.cpp 代码

#include "NaviteCode.h"
 

char data[12];
extern "C" {
	int MyAddFunc(int _a, int _b)
	{
		return _a + _b;
	}
 
	char* GetPkey() {
		//return new char[8]{ 'a','b','c','a','s','s','s','s' };
		data[0] = 'H';
		data[1] = 'e';
        data[2] = 'l';
        data[3] = 'l';
        data[4] = '0';
        data[5] = 'W';
        data[6] = 'o';
        data[7] = 'r';
        data[8] = 'l';
        data[9] = 'd';
        data[10] = '!';
		return data;
	}
}

还要在准备两个.mk文件,ndk编译的时候需要!

Android.mk 代码

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE     :=  NativeCode
# LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES  := NaviteCode.cpp
# LOCAL_LDLIBS     := -llog -landroid
# LOCAL_CFLAGS    := -DANDROID_NDK

include $(BUILD_SHARED_LIBRARY)

Application.mk 代码

APP_ABI := all
第二步:在Android Studio中生成so文件

打开Android Studio,新建一个工程,这里就不再多说了,很简单

然后在 app -> src -> main 下,新建一个jni文件夹,然后把上面总共四个文件放进去

如下图所示:

然后打开Android Studio中的终端Terminal

先cd进入我们新建的那个jni文件夹,然后输入命令:ndk-build
如下所示:

然后等待AS执行完成

会发现多了个lib文件夹,这文件夹里面就是我们要的so文件了!

so文件获取完毕,下一步去Unity端调用!

第三步:在Unity端调用so文件中的方法

现在我们拿到so文件了,新建一个Unity工程

然后在Assets下新建一个Plugins/Android文件夹,将我们生产的so文件放进去,如下图所示

然后添加几个简单的UI,两个Text文本,两个Button按钮
再写一个脚本,点击的时候执行对应的方法

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class UnitysoDemo : MonoBehaviour
{
    public Text t1;
    public Text t2;
    public Button b1;
    public Button b2;
    int ret;
    string key;
    [Dllimport("NativeCode")]
    public static extern int MyAddFunc(int x, int y);
    [Dllimport("NativeCode")]
    static public extern IntPtr GetPkey();

    private void Awake()
    {
        b1.onClick.AddListener(v1);
        b2.onClick.AddListener(v2);
    }
    // Use this for initialization
    void Start()
    {
         ret = MyAddFunc(200, 200);
         key = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(GetPkey());

    }
    void v1()
    {
        t1.text = ret.ToString();
    }
    void v2()
    {
        t2.text = key;
    }

}

代码解析

代码中的[Dllimport("DLLName")]是调用 so文件 的 固定调用方法
然后新建两个Text,待会点击Button的时候分别让两个Text文本显示从so文件调用来的数值

在start中已经执行调用so的方法了

比如下面代码中的这两行,意思就是调用一个名字为:libNativeCode的so中的MyAddFunc方法
MyAddFunc方法是我们在C++源文件中声明的方法

lib前缀是默认加上的,不需要管

   [Dllimport("NativeCode")]
    public static extern int MyAddFunc(int x, int y);

这个时候我们启动Unity,会发现控制台会报错

没事不慌,我在网上简单查了一下原因,发现在editor中是无法执行到这一块的

我们打包到真机测试就好了,下面看我打包到真机测试看看

打包也很简单,就是普通打包安卓apk,我想能用到接入so这一块的打包应该不用详细说明了!

然后看一下我真机打开的效果,就是在Unity端调用so中的方法。


总结

本篇文章到这里就结束啦

一开始以为Unity调用so会很麻烦,其实一个简单的调用还是很简单的

等到so中的方法变得很多很麻烦之后,调用起来才会麻烦一些!

整体来说就这几个步骤:

  1. 拿到给定的 .so文件
  2. 将 .so 文件放到Assets/Plugins/Android文件夹下
  3. C#中使用[Dllimport(“文件名”)] 进行调用,lib前缀和.so后缀都不要加进去,然后调用其中的方法就好

  • 如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 比如以下几个专栏:Unity基础知识学习专栏Unity游戏制作专栏Unity实战类项目 算法学习专栏
  • 可以学习更多的关于Unity引擎的相关内容哦!直接点击下面颜色就可以跳转啦!
 优质专栏分享 
 Unity基础知识学习专栏 
⭐️ Unity游戏制作专栏 ⭐️
 Unity实战类项目 
 小Y学算法 
 优质专栏分享 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号