目录


Unity与 SO 交互 ☀️| 详细讲解 Unity端使用C# 调用so文件的具体方法_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​​文件夹,然后把上面总共四个文件放进去

如下图所示:

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

然后打开​​Android Studio​​中的终端​​Terminal​

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

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

如下所示:

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

然后等待​​AS​​执行完成

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

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

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

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

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

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

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

然后添加几个简单的​​UI​​,两个​​Text​​文本,两个​​Button​​按钮Unity与 SO 交互 ☀️| 详细讲解 Unity端使用C# 调用so文件的具体方法_android_07

再写一个脚本,点击的时候执行对应的方法

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,会发现控制台会报错

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

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

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

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

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

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


????总结

本篇文章到这里就结束啦

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

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

整体来说就这几个​​步骤​​:


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



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

???? 优质专栏分享 ????


​???? Unity基础知识学习专栏 ????​


​⭐️ Unity游戏制作专栏 ⭐️ ​


​???? Unity实战类项目 ????​


​???? 小Y学算法 ????​


???? 优质专栏分享 ????

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