日記

Androidで”JNI_GetCreatedJavaVMs”を使ってJavaVMを取得する方法

cocos2d-x v3.0rc1が出てから1週間以上経ってますね。大きなバグがなければ1週間で正式版が出ると言ってたので、もうそろそろですかね?


rc0からrc1になって結構大きな変化がありました。
たぶん一番の目玉はWindowsPhone8の対応ですよね。
でも日本じゃ全然普及してないし、そもそもキャリアから販売されてないので、国内をターゲットにする場合はあんまり関係ないですね。
(Lumia欲しい)

で、次に大きいのはAndroidでNativeActivityから普通のJavaActivityになったこと。(2.xまでのに戻った)
広告表示とかやりやすいようなので、いい変更だとは思うんですが、これのせいで個人的にちょっとハマったんでメモ。

cocos2d-xのデフォのSimpleAudioEngineは、簡単に使えて、最低限の機能は用意されています。
ただ、プラットフォーム毎に再生する方法が違うため、再生できるフォーマットがそれぞれ違うという残念仕様です。
(wavとかmp3ならわりと全部対応してたりするんですけど、個人的にはoggを使いたい)
なので、OpenAL使って自前でやってます。(この辺は長くなりそうなので、そのうち記事にします)

AndroidのOpenALのライブラリではJNI_OnLoad()でJavaVMを取得して使っています。
rc0まではこれで問題なかったのですが、rc1ではcocos2d-x側でJNI_OnLoad()を使っています。
JNI_OnLoadは重複して実装できないので、片方消さないといけないですね。
JNI_OnLoadの中で何をやっているかというと、JavaVMを受け取って、保持しています。
片方でJavaVMを受け取ってもう片方に渡せば済む話ですが、別のライブラリ同士なのでちょいと面倒です。
他にJavaVMを取得する方法はないかと思って調べてみたら、”JNI_GetCreatedJavaVMs”なるものがあるようです。
アプリ上で作られたJavaVMを取得する関数のようです。JavaVMは1つしか作られないはずなので、これでたぶん大丈夫だと思います。
しかし、これAndroidでは実装されていないみたいです。
ググっても、JNI_OnLoadを使えっていう内容ばかりです。たぶんそっちが正攻法なんですよね。
でも、どうしてもJNI_GetCreatedJavaVMsを使いたくて調べてみたら、一応できるようです。
この関数はlibdvm.soにあって、dlopenを使えば、GetCreatedJavaVMsを使えるようになります。

#include <jni.h>
#include <dlfcn.h>
static JavaVM* javaVM = NULL;

static void GetJavaVM()
{
	if (!javaVM) {
		jint (*func)(JavaVM**, jsize, jsize*);
		jsize ct;
		void *handle = dlopen("/system/lib/libdvm.so", RTLD_NOW | RTLD_GLOBAL);
		func = dlsym(handle, "JNI_GetCreatedJavaVMs");
		(*func)(&javaVM, 1 ,&ct);
		dlclose(handle);
	}
}

こんな感じで使えます。これをJavaVMを使う部分の前に呼べばOKです。
あんまりいい方法じゃないのかもしれませんが、自分の環境ではちゃんと動いたのでとりあえず良しとします。
AndroidでのJNI_GetCreatedJavaVMsの使い方は調べても、全然日本語での情報が見つからないので記事にしてみました。
余談ですが、ファイルパスの”/system/lib/libdvm.so”は、英語の掲示板で書いてあったのをコピペしたんですが、
それがトラップで”/system/lib/libvdm.so”と誤字ってるのに気づかず、ハマりました。
コピペするときはちゃんと中身確認しないと駄目ですね。


rc1での他の変更点として、ScrollViewの改良があります。
スクロールの限界以上に引っ張ると、バネのように弾性のある感じ(いい表現がわからないけど伝わるよね?)になりました。
それとWindows/Mac/Linuxで、ウィンドウ内をマウスを押したあとに、外で離すと、onTouchEndedのイベントが呼ばれないバグが治りました。
これらのせいで、TableViewはイマイチ使えない感じだったのが、いい感じに使えるようになりました。
ただ、マウスホイールに対応していなかったり、スクロールバーがなかったりとちょっと残念なところはあるので、
その辺は自前で用意してます。次当たりにその辺の記事書いてみようと思います。

2014/04/13



CAPTCHA