今度はその逆でJava→c++に対して命令を実行するやり方をご紹介しましょう!
Eclipse側にあるmain.cppを編集します

// Java_[パッケージ名]_[メソッド名が書かれているjava名]_[メソッド](JNIEnv* env, jobject thiz,[引数])
// 今回はorg.cocos2dx.libパッケージにあるCocos2dxActivity.javaに定義したjniTest(int no)にしました
// パッケージ名の「.(ドット)」は「_(アンダーバー)」に置き換えるのがルールのようです。
void Java_org_cocos2dx_lib_Cocos2dxActivity_jniTest(JNIEnv* env, jobject thiz, jint no)
{
// cocos2d-x側で実行したいやつを書く
HelloWorld::sharedScene()->jniTest(no);
}

private static native void jniTest(int no);
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 好きなタイミングで呼び出したいメソッド名を書きます
// この例では引数に[10]を与えてます
Cocos2dxActivity.jniTest(10);
}
Xcodeで実際に呼び出す処理を書きます。
プログラムは結構はしょってるので、気をつけてください。
class HelloWorld : public cocos2d::CCLayer {
public:
~HelloWorld();
HelloWorld();
static HelloWorld* sharedScene(void);
// returns a Scene that contains the HelloWorld as the only child
static cocos2d::CCScene* scene();
void jniTest(int no);
}
#include "HelloWorldScene.h"
static HelloWorld *g_gameScene;
////////////////////////////////////////////////////////////////////////////////
HelloWorld* HelloWorld::sharedScene() {
return g_gameScene;
}
////////////////////////////////////////////////////////////////
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// add layer as a child to scene
g_gameScene = new HelloWorld();
scene->addChild(g_gameScene);
return scene;
}
////////////////////////////////////////////////////////////////////////////////
void HelloWorld::jniTest(int no)
{
CCLog("jniTest=%d", no);
}
これで受け渡しが出来ると思います。
ビルドするのを忘れずに!!
スポンサーサイト