我正在使用 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");
}

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

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

我已经尝试了很多其他的东西,但是与上面的那些相比没有什么意义。

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

谢谢你的帮助!

最佳答案

好的,简单来说,如果不向AJNMessageArgument类添加自定义代码,就无法做到这一点。这是因为在这种情况下,“值”方法将返回一个指向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

因此,现在,在我们的 objective-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];
 }

现在我们有了一个NSStrings NSStrings。 ew。

如果您想查看代码以从数组中的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;
 }

祝大家开心。

10-07 21:43