如何从原生 iOS 插件返回字符串统一?

     2023-03-30     215

关键词:

【中文标题】如何从原生 iOS 插件返回字符串统一?【英文标题】:How to return string from native iOS plugin to unity? 【发布时间】:2016-05-05 10:07:19 【问题描述】:

我正在创建一个需要向 Unity 返回字符串(或 const char*)的 iOS 插件。如何实现?

【问题讨论】:

【参考方案1】:

我想澄清以前的答案。 C# 声明:

[DllImport("__Internal")]
private static extern string getString();

从 objc 返回一个字符串就像@Cabrra 说的:

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);

虽然有人提到这种方式会导致内存泄漏,这是不对的。这种方式在 Unity 中运行良好,并且不会发生泄漏(我测试了很多次)。 Unity clearly states那个

从本地方法返回的字符串值应该是 UTF-8 编码并在堆上分配。 Mono marshalling 对这样的字符串免费调用。

【讨论】:

您也可以使用strdupreturn strdup([nsString UTF8String]);【参考方案2】:
    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:""];

【讨论】:

记得在字节转成托管字符串后再次释放字符串,否则继续使用malloc会出现内存泄漏,需要在c#代码中用Marshal.FreeHGlobal释放字符串我相信。 “您需要返回 c 字符串的副本,以便 Unity 处理内存并获取有效值”。这是否意味着 Unity 会自动处理内存管理?我同意@Chris 的观点,即需要释放 malloc 以避免内存泄漏。 Chris 我如何在 C# 中释放 C-malloced 内存?您能否提供有关 Marhsal.FreeGlobal 的更多详细信息? cStringCopy 在将 Objective-C NSString 传回 C# (Unity) 方面帮助了我很多 @AndreaGorrieri 仅澄清一下:_helloWorldString 在 C# 代码中的签名将是:static extern string _helloWorldString();。所以char*作为托管string返回Unity,不需要空闲,系统会自动释放。 顺便说一句 cStringCopy() 与自 1960 年代后期以来在标准 C 库中的 strdup() 完全相同。

如何从科尔多瓦自定义插件返回字符串

】如何从科尔多瓦自定义插件返回字符串【英文标题】:HowcanIreturnastringfromacordovacustomplugin【发布时间】:2015-09-0619:08:03【问题描述】:在cordova中创建自定义插件时,执行方法的返回类型是布尔值,但对于我的应用程序,我希望... 查看详情

如何将字符串从 C++ 原生传递到 C# Unity?

】如何将字符串从C++原生传递到C#Unity?【英文标题】:HowpassstringfromC++nativetoC#Unity?【发布时间】:2020-10-1514:37:08【问题描述】:我在SO上找到了这样的答案https://***.com/a/42987032/5709159还有我的实现C#统一[DllImport(m_pluginName,CallingConve... 查看详情

js原生方法原理探究:如何实现instanceof?

...实现instanceof方法。typeof操作符返回一个表示数据类型的字符串,它可以应付常规场景下的数据类型判断。对基本数据类型undefined、boolean、string、number、Symbol和引用数据类型function都可以正确判断,但是对null、数组、对象等则统... 查看详情

如何在 Flutter 插件中调试 iOS 原生代码?

】如何在Flutter插件中调试iOS原生代码?【英文标题】:HowtodebugiOSnativecodeinaflutterplugin?【发布时间】:2019-03-1703:14:34【问题描述】:我想知道如何在插件中调试FlutteriOS代码?我可以打开每当您创建插件时生成的示例应用程序,但... 查看详情

从原生控制器返回 Flutter 应用

】从原生控制器返回Flutter应用【英文标题】:GobacktoFlutterappfromnativecontroller【发布时间】:2021-01-1409:56:24【问题描述】:我正在从我的原生端打开iOS中的新联系人屏幕:letcontact=CNMutableContact.init()letcontroller=CNContactViewController.init(f... 查看详情

如何从原生 iOS 应用中收集慈善捐款?

】如何从原生iOS应用中收集慈善捐款?【英文标题】:HowtoCollectCharitableDonationsfromaNativeiOSApp?【发布时间】:2016-12-0914:49:52【问题描述】:我正在开发一个需要具有收集慈善捐款功能的应用程序。ApplePayontheWeb:AcceptableUseGuidelines我... 查看详情

如何从 socket.io 获取原生事件数组?

】如何从socket.io获取原生事件数组?【英文标题】:Howtogetarrayofnativeeventsfromsocket.io?【发布时间】:2013-08-2915:49:45【问题描述】:我正在我的节点websocket服务器中编写一些“屏蔽”代码,这样如果客户端尝试发送状态外的事件,... 查看详情

如何从 WKWebview 内的按钮单击重定向并使用目标 c 返回到 iOS 应用程序?

】如何从WKWebview内的按钮单击重定向并使用目标c返回到iOS应用程序?【英文标题】:HowtoredirectfromabuttonclickinsideWKWebviewandtogobacktotheiOSapplicationusingobjectivec?【发布时间】:2020-12-0905:35:37【问题描述】:我正在开发一个原生iOS应用... 查看详情

如何从原生 iOS Facebook SDK 获取用户兴趣?

】如何从原生iOSFacebookSDK获取用户兴趣?【英文标题】:HowtogetuserinterestsfromthenativeiOSFacebookSDK?【发布时间】:2012-10-2807:56:02【问题描述】:我一直在阅读文档,但找不到任何东西。对于名称、id等其他属性,它们在FBGraphUser类中... 查看详情

统一3d |后处理构建 |在为 iOS 构建创建 xcode 项目时,如何从统一脚本向 PBXProject 添加新的运行脚本?

】统一3d|后处理构建|在为iOS构建创建xcode项目时,如何从统一脚本向PBXProject添加新的运行脚本?【英文标题】:Unity3d|PostProcessBuild|HowtoaddnewrunscripttoPBXProjectfromunityscriptwhilecreatingxcodeprojectforiOSbuild?【发布时间】:2019-06-0614:40:20【... 查看详情

如何从 Windows 测试 ios 上的反应原生应用程序?

】如何从Windows测试ios上的反应原生应用程序?【英文标题】:HowcanItestareactnativeapponiosfromwindows?【发布时间】:2021-10-0409:42:43【问题描述】:我目前正在使用reactNative从我的windows计算机(我唯一的计算机)构建一个移动应用程序... 查看详情

如何从确认对话框插件返回布尔值?

】如何从确认对话框插件返回布尔值?【英文标题】:Howtoreturnbooleanfromconfirmdialogplugin?【发布时间】:2014-11-1514:57:48【问题描述】:在JavaScript中,他们有确认对话框,在单击是或否按钮时返回真或假。if(confirm(\'Yourquestion\'))//doth... 查看详情

如何从具有可链接性的 jQuery 插件的方法返回对象数组?

】如何从具有可链接性的jQuery插件的方法返回对象数组?【英文标题】:HowtoreturnanarrayofobjectsfromamethodofajQuerypluginwithchainability?【发布时间】:2011-07-0311:17:30【问题描述】:我正在使用插件方法“getSomeWhat”编写一个名为“myplugin... 查看详情

如何从原生 iOS 应用程序启动 Unity 3D 应用程序

】如何从原生iOS应用程序启动Unity3D应用程序【英文标题】:HowtolaunchUnity3DAppfromanativeiOSApp【发布时间】:2014-03-2704:40:28【问题描述】:我有一个用Xcode5开发的iOS项目。我还有一个用4.3免费版开发的Unity3D项目。这个Unity3D项目包含... 查看详情

已开源flutter穿山甲广告插件的集成-flutterads(代码片段)

...件flutter_pangle_ads插件特点🔨接入简单快速(封装原生端配置,仅需引入即可开始)♻️同时支持Flutter1x和2x版本📡事件统一返回(将原生端各种重要回调事件统一返回,方便业务处理和埋点统计等需求... 查看详情

从字符串变量反应原生渲染组件

】从字符串变量反应原生渲染组件【英文标题】:ReactNativerenderComponentsfromStringvariable【发布时间】:2019-01-0713:52:15【问题描述】:或者问题应该是,如何将字符串转换为JSX?无论如何,我正在尝试对我的reactnative应用程序进行性... 查看详情

如何将文件从 iOS 反应原生应用程序保存到 Files 文件夹

】如何将文件从iOS反应原生应用程序保存到Files文件夹【英文标题】:howtosavefilefromaniOSreactnativeapptoFilesfolder【发布时间】:2021-10-3111:35:08【问题描述】:我在我的iOS设备的本机应用程序中创建了一个pdf文件,并且我可以在我的应... 查看详情

如何通过 fb:// 从网页链接到 iOS 原生 Facebook 应用程序中的 Facebook STATUS

】如何通过fb://从网页链接到iOS原生Facebook应用程序中的FacebookSTATUS【英文标题】:HowtolinkfromawebpagetoFacebookSTATUSiniOSnativeFacebookappviafb://【发布时间】:2013-09-0804:02:14【问题描述】:我已经看到了很多关于通过fb://从网页中检索Facebo... 查看详情