安静如鸡

  • Home
  • About Me
  • Contact Me
  • 东京女子篮球活动记录
一个博客
  1. 首页
  2. Tech
  3. 正文

【Unity小帖士】Unity和C/C++原生Android第三方插件

2022-10-12 0人点赞 0条评论

不得不说Unity在Android插件方面的文档有点太老,各种出错。本篇主要是因为Call native plug-in for Android code文档提供的project无法执行顺便写的。

Unity不但支持用java和kotlin编译出的jar,arr插件,也支持直接由.c 编译成的.so文件的Android插件。如果是一些比较小的需求也可以直接写.java .kt文件放在Plugins文件夹下面。

具体可以参考: https://docs.unity3d.com/Manual/android-plugin-types.html

这里要说的是关于C/C++文件的Native插件。

最主要的就是把c/c++编译成.so的动态链接库然后在C#端用[DllImport()]这个Attribute导入Unity,这样就可以使用库里的函数了。简单的就是三部曲:

https://docs.unity3d.com/Manual/NativePlugins.html

To use a native plug-in:
1. Write functions in a C-based language to access the features you need.
2. Compile them into a library.
3. In Unity, create a C# script that calls functions in the native library.

这里涉及到iOS和其他platform不同的是iOS不支持动态链接库,所以导入的时候用__Internal导入静态库。

对于安卓来说可以参考这个文档Call native plug-in for Android code,下载里面的sample project作为参考。

但是这个文档里的project有点过时了,直接编译启动后会报错。需要把Application.mk,Android.mk和build_plugin.sh文件内容修改一下

APP_OPTIM        := release
APP_ABI          := arm64-v8a  # 修改(原本是armabi,现已不支持)
APP_PLATFORM     := android-8  # 这里可以改成和Unity一样的最低app level, 不改的话编译的时候会自动改
APP_BUILD_SCRIPT := Android.mk
include $(CLEAR_VARS)

# override strip command to strip all symbols from output library; no need to ship with those..
# cmd-strip = $(TOOLCHAIN_PREFIX)strip $1 

LOCAL_ARM_MODE  := arm
LOCAL_PATH      := $(NDK_PROJECT_PATH)
LOCAL_MODULE    := native # 这里便是需要在C#里面导入的Plugin Name,可以自行设置
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := NativeCode.c #需要编译的文件
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)
#!/bin/sh
echo ""
echo "Compiling NativeCode.c..."
export ANDROID_NDK_ROOT=/Applications/Unity/Hub/Editor/2021.3.10f1/PlaybackEngines/AndroidPlayer/NDK
$ANDROID_NDK_ROOT/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk $* # 此处build .so库文件
mv libs/arm64-v8a/libnative.so ..# 输出文件拷贝到Plugins/Android文件夹下面 如果路径不对就先不要执行这一行和下面的代码,先输出库文件看一下路径再修改

echo ""
echo "Cleaning up / removing build folders..."  #optional..
rm -rf libs/
rm -rf obj/

echo ""
echo "Done!"

上面三个文件修改好之后执行build_plugin.sh文件,Plugins/Android文件夹下面就会出现一个libnative.so的库文件。编译的原文件内容如下:

float add(float x, float y)
{
	return x + y;
}

然后在C#端导入库文件,并用extern声明add方法,就可以在C#里面执行库里的add方法了。

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CallNativeCode : MonoBehaviour {

	[DllImport("native")]
	private static extern float add(float x, float y);

	void Start ()
	{
		float x = 3;
		float y = 10;
		Debug.Log( "adding " + x  + " and " + y + " in native code equals " + add(x,y));
	}
}

关于从native里面call C#的函数可以参考https://docs.unity3d.com/Manual/NativePluginInterface.html设置callback。(aar和jar文件的插件也有其他的设置方法,下次再写。)

标签: 暂无
最后更新:2023-04-17

Ellison

什么都懂点,什么都不精。属于混吃等死,享受生活,过一天算一天的享乐主义。喜欢电影,阅读,以及游戏和美食。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2024 安静如鸡. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang