How to return string from native iOS plugin to unity?
I'd like to clarify previous answer. C# declaration:
[DllImport("__Internal")]private static extern string getString();
Returning a string from objc is exactly like @Cabrra said:
char* convertNSStringToCString(const NSString* nsString){ if (nsString == NULL) return NULL; const char* nsStringUtf8 = [nsString UTF8String]; //create a null terminated C string on the heap so that our string's memory isn't wiped out right after method's return char* cString = (char*)malloc(strlen(nsStringUtf8) + 1); strcpy(cString, nsStringUtf8); return cString;}extern "C" char* getString(){ const NSString* str = @"string"; return convertNSStringToCString(str);}
Though some people mentioned that this way will lead to a memory leak that is not right. This way works fine in Unity and no leaks occurs (I tested it many times). Unity clearly states that
String values returned from a native method should be UTF–8 encoded and allocated on the heap. Mono marshalling calls free for strings like this.
extern "C"{ int _pow2(int x) { // Just a simple example of returning an int value return x * x; } // Returns a char* (a string to Unity) char* _helloWorldString() { // We can use NSString and go to the c string that Unity wants NSString *helloString = @"Hello World"; // UTF8String method gets us a c string. Then we have to malloc a copy to give to Unity. I reuse a method below that makes it easy. return cStringCopy([helloString UTF8String]); } // Here is an example of getting a string from Unity char* _combineStrings(const char* cString1, const char* cString2) { // This shows we can create two NSStrings* from the c strings from Unity NSString *string1 = CreateNSString(cString1); NSString *string2 = CreateNSString(cString2); NSString *combinedString = [NSString stringWithFormat:@"%@ %@", string1, string2]; // Same as before, have to go to a c string and then malloc a copy of it to give to Unity return cStringCopy([combinedString UTF8String]); }}//I also like to include these two convenience methods to convert between c string and NSString*. You need to return a copy of the c string so that Unity handles the memory and gets a valid value.char* cStringCopy(const char* string){ if (string == NULL) return NULL; char* res = (char*)malloc(strlen(string) + 1); strcpy(res, string); return res;}// This takes a char* you get from Unity and converts it to an NSString* to use in your objective c code. You can mix c++ and objective c all in the same file.static NSString* CreateNSString(const char* string){ if (string != NULL) return [NSString stringWithUTF8String:string]; else return [NSString stringWithUTF8String:""];}