渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

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


f:id:esakun:20150730215258g:plain

本記事は前回からの続きに当たります。

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

やりたいこと

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

失敗コード

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

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で落ちる
似たようなトラブルの記事は見つかりますが、これではないんですね。

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

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

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

成功コード

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

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

環境

  • Unity2017.1.0f3
  • Xcode 8.3.3