3

我正在使用目标 C 在 iOS 上使用 AllJoyn。我在解析目标 C 中的 ALLJOYN_ARRAY 类型时遇到问题。问题是 MsgArg 类型(C++)是通过 AJNMessagArgument 类型(目标 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);
    }
}

现在在目标 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");
}

这将返回 ER_OK,但我无法通过调试器看到句柄中的任何数据,就像使用有效的 AJNMessageArguments 一样。

传入 &strings.handle 会引发编译错误“需要属性表达式的地址”。

我已经尝试了很多其他的东西,但与上面的相比,没有一个更有意义。

请帮我!我需要一个如何在 objc 中解析“as”签名的示例。我还没有找到任何文档。

谢谢你的帮助!

4

1 回答 1

1

好的,简短的故事是,如果不向 AJNMessageArgument 类添加自定义代码,就无法做到这一点。这是因为在这种情况下,“value”方法将返回一个指向 MsgArg 类型数组的指针。Objective C 不能与 MsgArg 交互——这就是他们为 Objective C 创建 AJNMessageArgument 包装器的全部原因。

这是如何完成的:

将此静态方法添加到您的 AJNMessageArgument.mm 类:

 + (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

所以现在,在我们的目标 C 代码中,我们可以解析带有签名“as”的 AJNMessageArgument - 但我们还不能将其转换为 MsgArg 类型,因为我们无法在 objc++ 之外访问该结构 - 所以我们将使用 (空白 *)。

 + (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];
 }

现在我们有了一个由 NSString 组成的 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;
 }

快乐 AllJoyn-ing。

于 2016-02-05T22:58:40.497 回答