Last active
March 10, 2020 18:57
-
-
Save brandenr/5118113 to your computer and use it in GitHub Desktop.
iOS Unity Plugin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:""]; | |
} |
ah, no, sorry, I just read this: http://www.mono-project.com/Interop_with_Native_Libraries#Strings_as_Return_Values
chesterbr: that page seems down - but do you mean that the above code using malloc will in fact not cause memory leaks?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the gist. Question: wouldn't every call _helloWorldString() leak one malloc instance? If so, any suggestions on how to memory-manage those? (or is it beeing free-ed behind the scenes somehow?)