引言
之前分享了一个文章:Unity显示C++动态库中的Log,其中使用到的主要能力就是,由C++动态库回调C#函数达到的。 这里我再对该功能进行专门的记录,并使用上面的这个文章做例子。
C++
首先,C++动态库中,先声明一个函数指针。
typedef void (*Log)(char* message, int iSize);
接着声明一下该指针类型的变量。
Log g_log;
如果需要将从C#传过来的函数地址全局保存,让其他的类都可以用这个回调函数,所以其他需要用到回调函数的ccp文件里,就需要再声明一次。
extern Log g_log;
然后就是导出一个接口,用来注册设置C#的函数地址。 头文件:
#ifndef DLL_API
#define DLL_API extern "C"
#endif
DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize));
源文件:
DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize))
{
g_log = Log;
}
这样,源文件的任何位置,当需要回调C#的函数时,只要调g_log 就可以了。
g_log(acLogStr, strlen(acLogStr));
C#
下面就是C#的代码,在C#中是由函数的委托来代替函数指针的。故代码如下。
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void LogDelegate(IntPtr message, int iSize);
[DllImport("mac", CallingConvention = CallingConvention.Cdecl)]
public static extern void InitCSharpDelegate(LogDelegate log);
[MonoPInvokeCallback(typeof(LogDelegate))]
public static void LogMessageFromCpp(IntPtr message, int iSize)
{
Debug.Log(Marshal.PtrToStringAnsi(message, iSize));
}
public static void ShowLog()
{
InitCSharpDelegate(LogMessageFromCpp);
}
现在,只需要在C#代码中调用ShowLog 静态函数(设置注册回调)之后,C++动态库就能回调C#端的函数了。 完整的代码示例在文章Unity显示C++动态库中的Log中,但有些差别,可以一起对照查看。
参考链接
https://blog.csdn.net/u011414997/article/details/50574434
|