不得不说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文件的插件也有其他的设置方法,下次再写。)
文章评论