当前位置:首页 » 《关注互联网》 » 正文

Unity与 SO 交互 ☀️| 详细讲解 Unity端使用C# 调用so文件的具体方法_呆呆敲代码的小Y

14 人参与  2021年08月27日 13:43  分类 : 《关注互联网》  评论

点击全文阅读


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

目录

        • 📢前言
    • 🎬Unity 使用C#调用so文件
        • 🚩第一步:准备好生成so文件的源文件
        • 🚩第二步:在Android Studio中生成so文件
        • 🚩第三步:在Unity端调用so文件中的方法
    • 💬总结

请添加图片描述


📢前言

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

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


🎬Unity 使用C#调用so文件

🚩第一步:准备好生成so文件的源文件

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

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

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

首先准备几个生成 so 的两个源文件NaviteCode.hNaviteCode.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学算法 💦
🚀 优质专栏分享 🚀

在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/26330.html

文件  调用  专栏  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1