前回に引き続き、JNIの使用方法をご紹介します。
Java側の実装で、追記するものは以下の2点です。
・cocos2dxから呼ぶ出すメソッド(C2JavaEvent)
・カメラを起動するための処理
※C2JavaEventメソッドがstaticな為、onCreate内でJNITest(Activity)をmActivityに保持する必要があります。
JNItest.java
public class JNItest extends Cocos2dxActivity{ private static JNITest mActivity; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mActivity = this; } public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); // test should create stencil buffer glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); return glSurfaceView; } static { System.loadLibrary("cocos2dcpp"); } //cocos2d-xから呼ぶメソッドの追加 public static void C2JavaEvent(){ //カメラをインテント起動する処理 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); mActivity.startActivity(intent); } }
以上で、Java側の実装は終了となります。
あとは、用意したJavaのメソッドをcocos2dから呼ぶだけになります。
前回の記事で作成したC++のソースに少しだけ追記します。
HelloWorldScene.cpp内にあるCCMenuのコールバック関数に
Link2Javaで作成したJavaメソッドを呼ぶ関数を実行するようにします。
void HelloWorld::menuCloseCallback(CCObject* pSender) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) Link2Java::C2JavaEvent(); #endif }
忘れずに、Link2Java.hもインクルードしましょう。
これでC++からJavaのメソッドを呼ぶ処理の実装が全て終了しました。
最後におまけでCCMenuを真ん中に表示するよう以下のように修正します。
//修正前 pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,origin.y + pCloseItem->getContentSize().height/2)); //修正後 pCloseItem->setPosition(ccp(visibleSize.width/2 ,visibleSize.height/2));
それでは、プロジェクトをビルドして起動します。
HelloWorldの画像やラベル等の処理を削除したので、表示される画面は以下のようになるかと思います。

真ん中のメニューを押すと…

無事にカメラを起動することが出来ました。
今回は単純にカメラをインテント起動するだけの処理でしたが
撮影した結果を返してもらいたい場合は、
Javaの実装を
onActivityResultメソッドをオーバーライドした上で
“startActivity” を “startActivityForResult” に変更することで
静止画もしくは動画の撮影後にコールバック関数としてonActivityResultが呼ばれるので
保存パスを受け取り、そのパスを引数に撮影した静止画(※1)でスプライトを生成するなんてことも出来てしまいます。
※1.動画の場合でサムネイルのスプライトを生成する時は、あらかじめJava側で動画のワンフレームから画像を生成する処理が必要になります。
JNIによるJavaメソッドの呼び出しが出来ると、製作するアプリの幅が広がるので是非チャレンジしてみてください。
以上で、C++からJavaの呼び方の説明は終了となります。
<次回以降の更新について>
次回は、JNIを使用したJavaからC++の関数を呼ぶ処理の実装方法をご紹介します。