前回の「iOSアプリのAndroid移植も簡単なUnityの基礎知識」では、「Unity」の概要や使い方、Unityの機能を拡張するプラグイン、リモートデバッグツールなどを紹介しました。
開発コストだけでなく移植コストを最小限に抑えてくれるUnityですが、よくあるマルチOS対応のソリューションでは、逆に個別のOSごとの個別実装ができない、あるいは難しいという点があったりします。
特にネイティブコードとの連携、ネイティブデバイスとの連携などが最たるものです。しかしUnityでは、この問題を解決する方法を提供しています。
今回はUnityが提供しているネイティブコードとの連携手段として、以下の2つの方法についてサンプルコードを交えて解説します。
手始めに、ありきたりではありますが、Javaクラス内で出力した文字列「Hello World」をUnity側で取得するサンプルから説明します。どうやってUnityからJava側のクラスやメソッドを呼び出すのか確認しましょう。
[File]→[New Project]で「HelloWorldJNI」プロジェクトを作成します。パッケージは特にインポートしません。
[File]→[Build Settings...]から[Build Settings]を開き、[Platform]を「Android」にして[Switch Platform]を押します。[Player Settings...]を押して[Inspector]ウィンドウにて[Bundle Identifier]にパッケージ名を指定します。ここでは「com.example.unity.hello」とします。
Javaクラスの開発環境には何を利用しても構いません。ここではEclipseを利用してプロジェクトとクラスを作成しました。
例として、パッケージ名を「com.example.java.helloworld」とし「HelloWorldJava」クラスを作成し、コンストラクタ1つと、静的メソッドを1つ、インスタンスメソッドを1つ作成しました。
package com.example.java.helloworld; public class HelloWorldJava { public HelloWorldJava(){ } static public String getStaticHello(){ return "Hello World, Static!"; } public String getHello(){ return "Hello World!"; } }
作成したクラスをコンパイルし、JARファイルにしてUnityプロジェクトのディレクトリ内に設置します。ここでは、Eclipseの[JAR Export]機能を用いて「HelloWorldJava.jar」として作成しています。
保存先には決まりがあり、「【Unityプロジェクトディレクトリ】/Assets/Plugins/Android/」の下に設置する必要があります。
UnityからJavaクラスを読み出す方法はいくつかありますが、一番分かりやすく簡単な方法は、Unityスクリプト上からC#やJavaScriptなどを用いてのJNI(Java Native Interface)アクセスを簡単にするヘルパークラス「AndroidJNIHelper」を利用する方法でしょう。
JNIと、後ほど使うAndroid NDKについての詳細は、以下の記事を参照しておいてください。
このヘルパークラスを利用するためのコードは、Unityのサイトからダウンロードできます。Unity Pluginに関するページの「Java Plugin Sample」の項目において「AndroidJNIHelper」を用いたサンプルアプリが提供されており、この中に下記で利用している各ファイルが提供されています。
. └─JavaPluginSample ├─Assets │ │ │ └─Plugins │ │ JavaVM.cs ←利用する │ │ JNI.cs ←利用する │ │ │ └─Android │ │ │ ├─bin │ │ │ ├─jni │ │ Android.mk ←利用する │ │ jni.cpp ←利用する │ │ │ ├─libs │ │ │ └─src │ └─Library
まず、ヘルパークラス用のネイティブライブラリ「libjni.so」をコンパイルするために、jni.cppファイルと、NDKビルド用のファイル「Android.mk」をJavaプロジェクト内の「jni」ディレクトリに設置します。
そして、Android NDKを用いてビルドします。
$ pwd /Users/daisuke.sato/workspace_from0308/itmedia/HelloWorldJava $ ls bin jni src $ ndk-build -B (Android NDK提供のコマンドを実行) Compile++ arm : jni /Users/daisuke.sato/workspace_from0308/itmedia/HelloWorldJava/libs/armeabi
ビルドすると「./libs/armeabi/」の下にlibjni.soファイルができます。
$ ls bin jni libs obj src $ ls -l ./libs/armeabi/ total 88 -rwxr-xr-x 1 daisuke.sato staff 41776 3 21 17:56 libjni.so
生成されたlibjni.soをJARファイルと同じ場所に設置します。すると、Unityプロジェクトのディレクトリ構成は下記のようになります。
次ページでは、Javaクラス呼び出し用C#スクリプトを作り、実際に動かしてみます。また、UnityがAndroid上で、どのように動作しているのかを解説します。
Copyright © ITmedia, Inc. All Rights Reserved.