本文章是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中的方法变得很多很麻烦之后,调用起来才会麻烦一些!
整体来说就这几个步骤
:
- 拿到给定的 .so文件
- 将
.so
文件放到Assets/Plugins/Android
文件夹下 - C#中使用
[DllImport(“文件名”)]
进行调用,lib前缀
和.so后缀
都不要加进去,然后调用其中的方法就好
- 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
- 🎄比如以下几个专栏:Unity基础知识学习专栏、Unity游戏制作专栏、Unity实战类项目 和 算法学习专栏
- 🎄可以学习更多的关于Unity引擎的相关内容哦!直接点击下面颜色就可以跳转啦!
🚀 优质专栏分享 🚀 |
🎄 Unity基础知识学习专栏 🎄 ⭐️ Unity游戏制作专栏 ⭐️ 🍇 Unity实战类项目 🍇 💦 小Y学算法 💦
🚀 优质专栏分享 🚀 |