Objective C消息参数数组解析(AJNMessageArgument)
Objective C Message Argument Array Parsing (AJNMessageArgument)
我正在使用 objective C 在 iOS 上与 AllJoyn 合作。我在解析 objective C 中的 ALLJOYN_ARRAY 类型时遇到问题。问题在于 MsgArg 类型 (C++) 是通过 AJNMessagArgument 类型 (objective c) 抽象出来的。 c++解析"a{iv}"数组签名的示例代码如下:
MsgArg *entries;
size_t num;
arg.Get("a{iv}", &num, &entries);
for (size_t i = 0; i > num; ++i) {
char *str1;
char *str2;
uint32_t key;
status = entries[i].Get("{is}", &key, &str1);
if (status == ER_BUS_SIGNATURE_MISMATCH) {
status = entries[i].Get("{i(ss)}", &key, &str1, &str2);
}
}
现在 objective c,msgarg 是 AJNMessageArgument 类型的句柄。我尝试了以下尝试让它无济于事:
AJNMessageArgument *strings = [AJNMessageArgument new];
size_t numVals;
QStatus status = [supportedLangsArg value: @"as", &numVals, strings.handle];
if(status != ER_OK){
NSLog(@"ERROR: Could not supported languages from the message argument");
}
这 returns ER_OK,但我无法通过调试器看到句柄中的任何数据,就像我可以使用有效的 AJNMessageArguments 一样。
传入 &strings.handle 会引发编译错误 "Address of property expression required"。
我已经尝试了很多其他的东西,但是 none 与上面的相比更有意义。
请帮帮我!我需要一个如何解析 objc 中的 "as" 签名的示例。我找不到这方面的任何文档。
感谢您的帮助!
好吧,简而言之,如果不向 AJNMessageArgument 添加自定义代码,就无法做到这一点 Class。这是因为在这种情况下,"value" 方法将 return 一个指向 MsgArg 类型数组的指针。 Objective C 无法与 MsgArg 交互——这就是他们为 Objective C 创建 AJNMessageArgument 包装器的全部原因。
这是如何完成的:
将此静态方法添加到您的 AJNMessageArgument.mm class:
+ (NSArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
{
NSMutableArray * toReturn = [NSMutableArray new];
MsgArg *msgArray = (MsgArg*) arg;
for (int i = 0; i < size; ++i)
{
void * msarg = malloc(sizeof(MsgArg));
MsgArg arg = msgArray[i];
memcpy(msarg, &msgArray[i], sizeof(MsgArg));
AJNMessageArgument *toAdd = [[AJNMessageArgument alloc] initWithHandle:msarg];
[toReturn addObject:toAdd];
}
return [toReturn copy];
}
不要忘记将方法定义添加到 AJNMessageArgument.h 文件中:
+ (NSMutableArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
所以现在,在我们的 objective C 代码中,我们可以解析带有签名 "as" 的 AJNMessageArgument - 但我们还不能将其转换为 MsgArg 类型,因为我们无法访问该结构在 objc++ 之外 - 所以我们将使用 (void *).
+ (NSArray*)getSupportedLangsFromMessageArgument:(AJNMessageArgument*)supportedLangsArg
{
void *strings; //void * to keep track of MsgArg array data.
size_t numVals;
QStatus status = [supportedLangsArg value: @"as", &numVals, &strings];
if(status != ER_OK){
NSLog(@"ERROR: Could not supported languages from the message argument");
}
NSMutableArray *arrayOfMsgArgs = [AJNMessageArgument getAJNMessageArgumentArrayFromMsgArgArray:strings :numVals];
//Now loop through the resulting AJNMessageArguments of type ALLJOYN_STRING - and parse out the string.
NSMutableArray *arrayOfStrings = [NSMutableArray new];
for (AJNMessageArgument *arg in arrayOfMsgArgs) {
NSString* msgArgValue = [AboutUtil getStringFromMessageArgument:arg];
[arrayOfStrings addObject:msgArgValue];
}
return [arrayOfStrings copy];
}
现在我们有了一个 NSStrings 的 NSArray。呼。
如果您想查看从数组中的 AJNMessageArguments 中获取 NSString 的代码,这里是该方法:
+ (NSString*)getStringFromMessageArgument:(AJNMessageArgument*)msgarg
{
char *charStr;
QStatus status = [msgarg value:@"s", &charStr];
if (status != ER_OK) {
NSLog(@"Error");
}
NSString *str = [NSString stringWithFormat:@"%s", charStr];
return str;
}
祝大家玩得开心。
我正在使用 objective C 在 iOS 上与 AllJoyn 合作。我在解析 objective C 中的 ALLJOYN_ARRAY 类型时遇到问题。问题在于 MsgArg 类型 (C++) 是通过 AJNMessagArgument 类型 (objective c) 抽象出来的。 c++解析"a{iv}"数组签名的示例代码如下:
MsgArg *entries;
size_t num;
arg.Get("a{iv}", &num, &entries);
for (size_t i = 0; i > num; ++i) {
char *str1;
char *str2;
uint32_t key;
status = entries[i].Get("{is}", &key, &str1);
if (status == ER_BUS_SIGNATURE_MISMATCH) {
status = entries[i].Get("{i(ss)}", &key, &str1, &str2);
}
}
现在 objective c,msgarg 是 AJNMessageArgument 类型的句柄。我尝试了以下尝试让它无济于事:
AJNMessageArgument *strings = [AJNMessageArgument new];
size_t numVals;
QStatus status = [supportedLangsArg value: @"as", &numVals, strings.handle];
if(status != ER_OK){
NSLog(@"ERROR: Could not supported languages from the message argument");
}
这 returns ER_OK,但我无法通过调试器看到句柄中的任何数据,就像我可以使用有效的 AJNMessageArguments 一样。
传入 &strings.handle 会引发编译错误 "Address of property expression required"。
我已经尝试了很多其他的东西,但是 none 与上面的相比更有意义。
请帮帮我!我需要一个如何解析 objc 中的 "as" 签名的示例。我找不到这方面的任何文档。
感谢您的帮助!
好吧,简而言之,如果不向 AJNMessageArgument 添加自定义代码,就无法做到这一点 Class。这是因为在这种情况下,"value" 方法将 return 一个指向 MsgArg 类型数组的指针。 Objective C 无法与 MsgArg 交互——这就是他们为 Objective C 创建 AJNMessageArgument 包装器的全部原因。
这是如何完成的:
将此静态方法添加到您的 AJNMessageArgument.mm class:
+ (NSArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
{
NSMutableArray * toReturn = [NSMutableArray new];
MsgArg *msgArray = (MsgArg*) arg;
for (int i = 0; i < size; ++i)
{
void * msarg = malloc(sizeof(MsgArg));
MsgArg arg = msgArray[i];
memcpy(msarg, &msgArray[i], sizeof(MsgArg));
AJNMessageArgument *toAdd = [[AJNMessageArgument alloc] initWithHandle:msarg];
[toReturn addObject:toAdd];
}
return [toReturn copy];
}
不要忘记将方法定义添加到 AJNMessageArgument.h 文件中:
+ (NSMutableArray*)getAJNMessageArgumentArrayFromMsgArgArray:(void*)arg : (int)size
所以现在,在我们的 objective C 代码中,我们可以解析带有签名 "as" 的 AJNMessageArgument - 但我们还不能将其转换为 MsgArg 类型,因为我们无法访问该结构在 objc++ 之外 - 所以我们将使用 (void *).
+ (NSArray*)getSupportedLangsFromMessageArgument:(AJNMessageArgument*)supportedLangsArg
{
void *strings; //void * to keep track of MsgArg array data.
size_t numVals;
QStatus status = [supportedLangsArg value: @"as", &numVals, &strings];
if(status != ER_OK){
NSLog(@"ERROR: Could not supported languages from the message argument");
}
NSMutableArray *arrayOfMsgArgs = [AJNMessageArgument getAJNMessageArgumentArrayFromMsgArgArray:strings :numVals];
//Now loop through the resulting AJNMessageArguments of type ALLJOYN_STRING - and parse out the string.
NSMutableArray *arrayOfStrings = [NSMutableArray new];
for (AJNMessageArgument *arg in arrayOfMsgArgs) {
NSString* msgArgValue = [AboutUtil getStringFromMessageArgument:arg];
[arrayOfStrings addObject:msgArgValue];
}
return [arrayOfStrings copy];
}
现在我们有了一个 NSStrings 的 NSArray。呼。
如果您想查看从数组中的 AJNMessageArguments 中获取 NSString 的代码,这里是该方法:
+ (NSString*)getStringFromMessageArgument:(AJNMessageArgument*)msgarg
{
char *charStr;
QStatus status = [msgarg value:@"s", &charStr];
if (status != ER_OK) {
NSLog(@"Error");
}
NSString *str = [NSString stringWithFormat:@"%s", charStr];
return str;
}
祝大家玩得开心。