Unity5でAndroidの共有ライブラリと文字列のやり取りをする
前回の Unity5でAndroidの共有ライブラリを使うでは、Unity から共有ライブラリを呼び出せるようにしました。
その後、思っていたよりも文字列のやり取りが分かり辛かったので、共有ライブラリと文字列をやり取りする手順もまとめておきます。
[環境]
Unity 5.1.0f3
Android NDK r10e
今回は、共有ライブラリ内にグローバル変数で char 配列を宣言しておき、この配列の値を更新/取得できるようにします。
Unity と共有ライブラリ間のやり取りを確認するだけなので、バッファオーバーランなどは確認しません。
まじめにやるなら、文字列更新毎に free と malloc をして、共有ライブラリの終了時に free するようにします。
- 共有ライブラリの拡張
前回作成した共有ライブラリに機能を追加して、以下のようにします。
#include <string.h>
extern "C" {
int GetHelloUnityInt();
float GetHelloUnityFloat();
void GetHelloUnityString(char* output);
void SetHelloUnityString(char* input);
}
// 文字列保存領域.
char g_tempString[2048];
int GetHelloUnityInt()
{
return 123456;
}
float GetHelloUnityFloat()
{
return 1.23456;
}
void GetHelloUnityString(char* output)
{
strcpy(output, g_tempString);
}
void SetHelloUnityString(char* input)
{
strcpy(g_tempString, input);
}
- Unity 側の C# スクリプトに文字列の読み書き処理を追加する
ここの対応ではまったのですが、以下の対応で落ち着きました。
・共有ライブラリから受け取る時には StringBuilder
・共有ライブラリへ渡す時にはマーシャリングして String
受け取る場合は、DllImport に CharSet.Auto も設定しておきます。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Runtime.InteropServices;
using System; // use String.
using System.Text; // use StringBuilder.
public class HelloUnity : MonoBehaviour
{
// 共有ライブラリの関数を取得する.
[DllImport ("HelloUnity")]
private static extern int GetHelloUnityInt();
[DllImport ("HelloUnity")]
private static extern float GetHelloUnityFloat();
[DllImport ("HelloUnity", CharSet = CharSet.Auto)]
private static extern void GetHelloUnityString(StringBuilder output);
[DllImport ("HelloUnity")]
private static extern void SetHelloUnityString([MarshalAs(UnmanagedType.LPStr)] String input);
// 共有ライブラリ出力用テキスト.
public Text textInt;
public Text textFloat;
public Text textString;
// Use this for initialization
void Start ()
{
// 共有ライブラリから取得した値をテキストに代入する.
textInt.text = GetHelloUnityInt().ToString();
textFloat.text = GetHelloUnityFloat().ToString();
// 共有ライブラリに文字列を保存する.
String input = "Hello Unity.";
SetHelloUnityString(input);
// 共有ライブラリから取得した文字列をテキストに代入する.
StringBuilder helloUnityChar = new StringBuilder();
GetHelloUnityString(helloUnityChar);
textString.text = helloUnityChar.ToString();
}
}
- 表示用テキストの設定を追加
Hierarchy にある Canvas にテキストを追加します。
ここでは名称は TextString としています。
Hierarchy から HelloUnity を選択して、 textString に Hierarchy から TextString をドラッグして関連付けをします。
- ビルドして動作確認
ビルド後、エミュレータにインストールして、3段目のテキストに「Hello Unity.」と表示されれば OK です。
Android 向けになにか作ろうとすると、いろんな事情で NDK を使わざるおえないことが多いのですが、NDK に対応しようとすると、ネイティブや Unity などなにを使うにしても分かりづらいのでなんとかしてほしい。
Android Studio が NDK に対応したので、今後は使い勝手がよくなっていくといいなぁ。
おしまい。




ディスカッション
コメント一覧
まだ、コメントがありません