【问题标题】:Sending float* from Objective C to C#将 float* 从 Objective C 发送到 C#
【发布时间】:2018-05-23 12:47:56
【问题描述】:

我正在制作一个 Unity 项目并尝试将在 iPhone 上的BLE (BlueTooth) 收到的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

}

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

【问题讨论】:

  • 我正在实现代码。完成后我可以详细讨论。请不要关闭那些试图关闭此帖子的人。

标签: c# objective-c unity3d interopservices


【解决方案1】:

让我描述一下我如何实现从 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 之上,有一个声明。

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的方式。

【讨论】:

  • 这如何将 Float 数组从 iOS 原生传递到 Unity?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2012-01-04
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多