Unity5でAndroidの共有ライブラリを使う

2016年9月22日

Android の共有ライブラリを Unity で使う手順をまとめます。
Unity Editor 上では、Android の共有ライブラリは動作しないので、Android のエミュレータおよび実機上で確認できるように Unity で Scene を作成します。

共有ライブラリの読み込みについては、以下の公式リファレンスを参考にしています。
Unity マニュアル – Android 用のプラグインをビルド

[環境]
Unity 5.1.0f3
Android NDK r10e

  1. 共有ライブラリの準備
    まずは適当に HelloUnity という名前の共有ライブラリを作ります。
    共有ライブラリ側では、Unity から参照したいメソッドを extern “C" でくくってあればいいようです。
    JNI を使わなくても呼べるみたいなので、まずはその方向で作ってみます。

JNI を使って Android ライブラリ(.jar)を作成して、Unity で読み込む方法もあります。

extern "C" {

    int GetHelloUnityInt();
    float GetHelloUnityFloat();

}

int GetHelloUnityInt()
{
    return 123456;
}

float GetHelloUnityFloat()
{
    return 1.23456;
}
LOCAL_PATH := $(call my-dir)
MY_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(MY_PATH)


#
# HelloUnity の共有ライブラリを作成.
#

include $(CLEAR_VARS)
LOCAL_MODULE := HelloUnity
LOCAL_SRC_FILES := HelloUnity.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
  1. 共有ライブラリの配置
    Assets -> Plugins -> Android という感じにディレクトリを作って配置します。
    Unity 側でターゲットプラットフォームに合ったプラグインを自動的に読み込んでくれます。
    ただし、x86 と armeabi-v7a をターゲットにする場合には、Android -> libs -> x86 のようにディレクトリをさらに作成する必要があります。

公式リファレンスの日本語訳はこういう書き方でしたが、ほんとにこのふたつだけが特例なのかはわかりません。

今回は以下のような配置になりました。
HelloUnity/Assets/Plugins/Android/libs/armeabi-v7a/libHelloUnity.so

  1. 共有ライブラリの出力を表示する領域の作成
    Android の共有ライブラリは Unity でデバッグできないので、共有ライブラリから取得した値を確認する手段がありません。
    なので、共有ライブラリから取得した値を表示するオブジェクトを用意しておきます。

適当に uGUI を使ってテキストオブジェクトを配置しておいて、そこに共有ライブラリから取得した数値を出力するようにしておきます。

20150829_HelloUnity_uGUI

これで、Android 上で共有ライブラリの出力が確認できます。

  1. Unity 側で C# での共有ライブラリの読み込み
    表示領域を作ったので、Unity 側で HelloUnity.cs を追加して、共有ライブラリの呼び出しを行ってみます。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Runtime.InteropServices;

public class HelloUnity : MonoBehaviour
{
    // 共有ライブラリの関数を取得する.
    [DllImport ("HelloUnity")]
    private static extern int GetHelloUnityInt();
    [DllImport ("HelloUnity")]
    private static extern float GetHelloUnityFloat();

    // 共有ライブラリ出力確認用オブジェクト.
    public Text textInt;
    public Text textFloat;

    void Start ()
    {
        // 共有ライブラリから取得した値をテキストに代入する.
        textInt.text = GetHelloUnityInt().ToString();
        textFloat.text = GetHelloUnityFloat().ToString();
    }
}
  1. HelloUnity スクリプトが動作するようにする

Hierarchy から HelloUnity という名称で Empty Object を作成して、コンポーネントに HelloUnity.cs を設定します。
public で宣言しておいた textInt/textFloat が Inspector に表示されているので、Hierarchy から TextInt/TextFloat をドラッグして関連付けしておきます。

  1. Unity で apk ファイルをビルドする
     1. Unity のメニューから File -> Build settings を選択します
     2. Platform で Android を選択して、"Switch Platform" ボタンを押します
     3. “Player settings" ボタンを押して、Inspecter で Settings for Android -> Other Settings -> Identification -> Bundle   Identifier を変更します
      ここでは “com.example.hellounitysample" とします
     4. 同様に、Setting for Android -> Other Settings -> Configuration -> Install Location を変更します
      デフォルトは “Prefer External" になっているので “Automatic" に変更します
      これを変更しておかないと、apk をインストールする際に “Failure [INSTALL_FAILED_CONTAINER_ERROR]" が発生しました
     5. Build settings ダイアログに戻って、"Build" ボタンを押します

  2. エミュレータにインストール
    adb install で、Unity から出力された apk をインストールします

  3. 起動
    エミュレータにインストールされたアプリケーションを起動すると、このように共有ライブラリで渡している値が出力されました。

20150829_HelloUnity_result

ということで、無事に共有ライブラリを Unity で使用できるようになりました。
あとは NDK で頑張ってライブラリを作れば OK です。

おしまい。

スポンサーリンク