将可变大小的字符串C数组编组到C#中(Unity iOS)

oxosxuxt  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(86)

我需要从Objective-C返回一个字符串集合到C#,但我无法正确地完成这一任务。当我在托管端打印返回的指针时,它的值是0。
目标c

FOUNDATION_EXPORT int _GetAllKeys(char** pointer)
{
    NSArray* array = @[@"key1", @"key2"]; // dummy strings
    
    int size = (int)array.count;

    pointer = malloc(size * sizeof(char *));
    
    for (int i = 0; i < size; i++)
    {
        pointer[i] = MakeStringCopy(array[i]);
    }
    return size;
}

字符串
C#语言

[DllImport("__Internal")]
private static extern int _GetAllKeys(out IntPtr buffer);

internal static IEnumerable<string> GetAllKeys()
{
    int count = _GetAllKeys(out var buffer);
    List<string> keys = new List<string>();
    for (int i = 0; i < count; i++)
    {
    keys.Add(Marshal.PtrToStringUTF8(IntPtr.Add(buffer, IntPtr.Size))); //eventually when i make this work the strings will be returned as UTF8 but for now its not even making it to this line, so ignore the encoding.
    }

    return keys;
}

  • 解决方案-
    目标c
FOUNDATION_EXPORT int _GetAllKeys(char*** pointer)
{
    NSArray* array = @[@"key1", @"key2"];  
    int size = (int)array.count;
    
    *pointer = malloc(size * sizeof(char *));

    for (int i = 0; i < size; i++)
    {
        (*pointer)[i] = MakeStringCopy(array[i]);
    }
    
    return size;
}


C#语言

[DllImport("__Internal")]
private static extern int _GetAllKeys(out IntPtr buffer);

internal static IEnumerable<string> GetAllKeys()
{
    int count = _GetAllKeys(out var buffer);
    List<string> keys = new List<string>();
    for (int i = 0; i < count; i++)
    {
        IntPtr ptr = Marshal.ReadIntPtr(buffer);
        keys.Add(Marshal.PtrToStringAuto(ptr));
        buffer = IntPtr.Add(buffer, IntPtr.Size);
    }

    return keys;
}

t98cgbkg

t98cgbkg1#

你试图返回一个char**,所以C函数的参数需要是一个char*:

FOUNDATION_EXPORT int _GetAllKeys(char*** pointer)
{
   NSArray* array = @[@"key1", @"key2"]; // dummy strings
   int size = (int)array.count;

   *pointer = malloc(size * sizeof(char *));

   for (int i = 0; i < size; i++)
   {
       (*pointer)[i] = MakeStringCopy(array[i]);
   }
   return size;
}

字符串
C#代码看起来很好,除了IntPtr.Add返回一个新的IntPtr,所以它必须是:

keys.Add(Marshal.PtrToStringUTF8(buffer));
buffer = IntPtr.Add(buffer, IntPtr.Size);

相关问题