如何从 Java 替换 cocos2d-x 场景?

How to replace cocos2d-x scene from Java?

我想替换 Java 的 cocos2d 项目中的场景。我创建了以下 JNI 方法:

void cocos_android_app_init (JNIEnv* env, jobject thiz) {
    LOGD("cocos_android_app_init");
    AppDelegate *pAppDelegate = new AppDelegate();
}

extern "C" {
    JNIEXPORT void JNICALL Java_com_example_myapp_MainActivity_changeScene( 
        JNIEnv* env, jobject thiz){
            cocos2d::Scene* scene = MyScene::createScene();
            Director::getInstance()->replaceScene(
                 TransitionFade::create( 1, scene ));
            //NOT WORKING BECAUSE Director::getInstance() is NULL
}
}

但是,当从 java 调用方法 changeScene 时,我的应用程序崩溃了,因为 Director::getInstance() 似乎是一个 NULL 指针。从Java怎么才能正确改变场景?

您必须在 AppDelegate

中引用 Director::getInstance()

我试过了:

extern "C"
{
    void Java_org_cocos2dx_cpp_SceneChanger_nativeCallbackChangeScene(JNIEnv*  env, jobject thiz)
    {
        Director::getInstance()->replaceScene(MyScene::createScene());
    }
};

替换场景成功。

你确定 Director::getInstance() 是空指针吗?

确保您 运行正在 OpenGL 线程上。

检查你的错误日志,寻找一行 call to OpenGL ES API with no current context 这意味着你没有 运行ning 在 gl 线程上。

要在 gl 线程上 运行 使用此代码:

Director::getInstance()->getScheduler()->performFunctionInCocosThread([&](){
    Director::getInstance()->replaceScene(MyScene::createScene());
});