将 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
。
我正在制作一个 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
。