将 float* 从 Objective C 发送到 C#

Sending float* from Objective C to C#

我正在制作一个 Unity 项目并尝试将 BLE (BlueTooth) 在 iPhone 收到的 float* array 发送到 Unity 项目的 C# code

那些从C#发起到C++端的函数调用,通过传递数组的方式来接收数据是很常见的。 但是在这里,当接收到数据时,此数据传输从 Objective 端启动到 C#。

我使用插件与 C# 接口。

我的Objective C那边有

BLEObject.h, BLEObject.m, UnityBridge.h and UnityBridge.mm。 UnityBridge 是与 C# 接口的 C++ 代码。

UnityBridge.h 有

#ifdef __cplusplus
extern "C" {
#endif 
    void CallMethod(float* array);   

#ifdef __cplusplus
}
#endif

UnityBridge.mm 有

#import "UnityBridge.h"    

void CallMethod(float* objectName)
{
    //some implementation here
}

BLEObject.h 有

+(void) sendMessage:(NSData*)floatArray;

BLEObject.m有

+(void) sendMessage:(NSData*)floatArray 
{
    //I need to convert here NSData* to float array, how?
    CallMethod(floatArray);
}

当我在Objective C端收到来自BLE, I call [BLEObject sendMessage:floatArray]的数据时。

然后在C#端,

[DllImport ("__Internal")]
    public static extern void CallMethod (float* array);

然后我将 CallMethod 实现为

public static void CallMethod (float* array){
    //reading array here

}

其实这段代码行不通,但这是我喜欢实现的流程。 我该如何实施?

让我描述一下如何实现从 Objective C 到 C# 的回调。

Inside UnityBridge.h and UnityBridge.mm:

typedef void (*UnityCommandCallback) ();

#ifdef __cplusplus
extern "C" {
#endif
    void ConnectCallback(UnityCommandCallback callbackMethod);    
    void CallMethod();
#ifdef __cplusplus
}
#endif

#import "UnityBridge.h"
//THis is the implementation of methods in the header file
//A static variable to hold our function pointer
static UnityCommandCallback LastCallBack = NULL;
void ConnectCallback(UnityCommandCallback callbackMethod)
{
    LastCallBack = callbackMethod;//a simple assignment using the connect method

}

void CallMethod()
{
    if(LastCallBack != NULL)
        LastCallBack(/*objectName, methodName, parameter*/);
}

所以这个LastCallBack记住了当事件发生在Objective C端时回调的函数。

Inside BLEObject.h, BLEObject.m:

在BLEObject.m之上,有一个decalaration。

extern void CallMethod();

所以每当有事件发生时,你就称之为 CallMethod()。 由于记忆了最后一个回调函数,它总是会回到你在C#中想要的同一个地方。

C# 内部: 你有这个

public class BLEBridge : MonoBehaviour {

    public delegate void UnityCallbackDelegate(/*IntPtr objectName, IntPtr methodName, IntPtr parameter*/);
    [DllImport ("__Internal")]
    public static extern void ConnectCallback(UnityCallbackDelegate callbackMethod);
    [MonoPInvokeCallback(typeof(UnityCallbackDelegate))]
    private static void ManagedTest()
    {
        Debug.Log("IT WORKS!!!!");
    }
}

在 C# 对象的初始化过程中,我们称之为

public static void TestSendMsg()
    {
        ConnectCallback (ManagedTest);
    }

所以Objective C方知道

`ManagedTest()` is the function to call back whenever an event happens at Objective C side.

我就是这样实现的Callback from Objective C going through C++ interface to C# Unity side