昨日投稿した「GomobileからAARを作ってUnityで動かしてみた」からShared Libraryだけで動くよね?ということでやってみた。
前回作ったライブラリ
hoge.go
package hoge
func GetInt() int {
return 10
}
$ gomobile bind -target=android .
$ unzip -Z1 hoge.aar
AndroidManifest.xml
proguard.txt
classes.jar
jni/armeabi-v7a/libgojni.so
jni/arm64-v8a/libgojni.so
jni/x86/libgojni.so
jni/x86_64/libgojni.so
R.txt
res/
今回の対応
libgojni.soの中身を見る。
Java_go_hoge_Hoge_getIntが使えそうだ。
$ nm libgojni.so | grep -i getint
0000000000195760 T Java_go_hoge_Hoge_getInt
00000000001353e0 t _/var/folders/9b/3xn807qd3y9955mt2qwl58mc0000gn/T/gomobile-work-060054096/gomobile_bind._cgoexpwrap_6a40b88305f8_proxyhoge__GetInt
0000000000230b68 d _/var/folders/9b/3xn807qd3y9955mt2qwl58mc0000gn/T/gomobile-work-060054096/gomobile_bind._cgoexpwrap_6a40b88305f8_proxyhoge__GetInt.f
00000000001353a0 T _cgoexp_6a40b88305f8_proxyhoge__GetInt
0000000000195540 T proxyhoge__GetInt
hoge.aarのjni配下をUnityに配置する
hoge.aarを解凍して、下記二つをUnityのAssets/Plugins/Android/libs
に配置する。
x86_64
とarm64-v8a
はビルド時に拒否られた。何か設定必要?
- Plugins/Android/libs/armeabi-v7a/libgojni.so
- Plugins/Android/libs/x86/libgojni.so
気持ちrenameしてみる。
libgojni.so -> libhoge.so
Unityの処理
前回と同じく加算する処理を書いた。
using UnityEngine;
using System.Runtime.InteropServices;
public class ButtonTest : MonoBehaviour {
int gnum = 0;
[DllImport("hoge")]
private static extern int Java_go_hoge_Hoge_getInt();
public void TestClick()
{
int num = Java_go_hoge_Hoge_getInt();
Debug.Log(num);
gnum += num;
}
void OnGUI(){
GUI.Label (new Rect (0, 0, 100, 30), gnum.ToString());
}
}
感想
すごい簡単に使えるようになった。
prefixがうざいので何かいい方法ないのかな?
他は毎回実機にインストールが面倒くさいので、開発時はMac用のShared Libraryを作って置くのが良さそう。
小ネタ: Shared Libraryの容量大きい
% du
3.4M ./arm64-v8a
2.5M ./armeabi-v7a
2.4M ./x86
3.4M ./x86_64
12M .