渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

UnityとObjective-Cのやりとり文字列編

UnityとObjective-Cのやりとり文字列編

こんにちは、Unityエンジニアのオオバです。

本記事は前回からの続きに当たります。
UnityとObjective-Cのやりとり

Unityでネイティブプラグインを作る上でint型のやり取りは、すんなり成功したのですが、String型でハマってしまったのでメモ。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

やりたいこと

  • ネイティブプラグインの関数を実行すると文字列を返却してログ出力する

失敗コード

Unityネイティブプラグイン文字列やり取りの失敗例 · GitHub

この失敗コードを実機でビルドしてみると、、、以下の箇所で以下のエラーが出力されます。

inline void il2cpp_codegen_marshal_free(void* ptr)  
{
    il2cpp::vm::PlatformInvoke::MarshalFree(ptr);  
}

エラー内容

nativePlugin(976,0x1b1463b40) malloc: *** error for object 0x10083ffd5: pointer being freed was not allocated  

[Unity] il2cpp::vm::PlatformInvoke::MarshalFreeでSIGBARTで落ちる | script life 千夜一夜 プログラミング別館
似たようなトラブルの記事は見つかりますが、これではないんですね。

直訳すると、解放されたポインタが割り当てられなかったというエラーになります。

いろいろ調べた結果[Unity] C#とObjective-Cの連携まとめ - Qiita こちらの記事内容で解決しました。

文字列の場合は明示的にメモリを確保し、そこに文字列をコピーし、そのポインタを返さないといけない模様です。

成功コード

先のサイトを参考に修正したコードがコチラ。

BridgeCSharpToObjC.cs · GitHub

何かと躓くネイティブプラグイン先が長いです。

オススメ記事
検証環境
  • Unity2017.1.0f3
  • Xcode 8.3.3