Unity5でAndroidの共有ライブラリと文字列のやり取りをする

2016年9月22日

前回の Unity5でAndroidの共有ライブラリを使うでは、Unity から共有ライブラリを呼び出せるようにしました。
その後、思っていたよりも文字列のやり取りが分かり辛かったので、共有ライブラリと文字列をやり取りする手順もまとめておきます。

[環境]
Unity 5.1.0f3
Android NDK r10e

今回は、共有ライブラリ内にグローバル変数で char 配列を宣言しておき、この配列の値を更新/取得できるようにします。
Unity と共有ライブラリ間のやり取りを確認するだけなので、バッファオーバーランなどは確認しません。
まじめにやるなら、文字列更新毎に free と malloc をして、共有ライブラリの終了時に free するようにします。

  1. 共有ライブラリの拡張
    前回作成した共有ライブラリに機能を追加して、以下のようにします。
#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);
}
  1. 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();
    }
}
  1. 表示用テキストの設定を追加

Hierarchy にある Canvas にテキストを追加します。
ここでは名称は TextString としています。

20150830_HelloUnity_uGUI

Hierarchy から HelloUnity を選択して、 textString に Hierarchy から TextString をドラッグして関連付けをします。

  1. ビルドして動作確認

ビルド後、エミュレータにインストールして、3段目のテキストに「Hello Unity.」と表示されれば OK です。

Android 向けになにか作ろうとすると、いろんな事情で NDK を使わざるおえないことが多いのですが、NDK に対応しようとすると、ネイティブや Unity などなにを使うにしても分かりづらいのでなんとかしてほしい。
Android Studio が NDK に対応したので、今後は使い勝手がよくなっていくといいなぁ。

おしまい。

スポンサーリンク