Jni 之java调用c++和editbox无法上屏问题的总结

  1. JNI 中 JAVA回调C++, 绝不可以直接操作 UI,而是应通过 Director::getInstance()->getScheduler()->performFunctionInCocosThread()运行在COCOS的线程里面来执行。

  2. EDITBOX 的安卓包装比较的坑,在回调的时候 通过
    Cocos2dxHelper.sCocos2dxHelperListener.runOnGLThread 来放回COCOS线程运行?但自从接了QQ登陆后,再也没法回调 editBoxCallbackFunc 了。
    具体原因没有查明,以下是我的规避代码:

  3. 改成JAVA直接回调C++回调函数 nativeSetEditTextDialogResult

  4. 把 C++ nativeSetEditTextDialogResult 原有代码放到 Director::getInstance()->getScheduler()->performFunctionInCocosThread() 来执行。

  5. 问题解决。

    public static void setEditTextDialogResult(final String pResult) {
    try {
    Log.i(“cocos2d-x”, “txt:=” + pResult);
    final byte] bytesUTF8 = pResult.getBytes(“UTF8”);

         Cocos2dxHelper.nativeSetEditTextDialogResult(bytesUTF8);
    
     } catch (UnsupportedEncodingException pUnsupportedEncodingException) {
         /* Nothing. */
         
         Log.i("cocos2d-x", "UnsupportedEncodingException");
     }
    

    }

///以下为C++代码

static void editBoxCallbackFunc(const char* pText, void* ctx)
{
CCLOG(“editBoxCallbackFunc %s”, pText);

std::string str(pText);

Director::getInstance()->getScheduler()->performFunctionInCocosThread((){
    CCLOG("editBoxCallbackFunc run %s", str.c_str() );
    
    EditBoxImplAndroid* thiz = (EditBoxImplAndroid*)ctx;
    thiz->setText(str.c_str() );
    
    if (thiz->getDelegate() != NULL)
    {
        thiz->getDelegate()->editBoxTextChanged(thiz->getEditBox(), thiz->getText());
        thiz->getDelegate()->editBoxEditingDidEnd(thiz->getEditBox());
        thiz->getDelegate()->editBoxReturn(thiz->getEditBox());
    }

#if CC_ENABLE_SCRIPT_BINDING
EditBox* pEditBox = thiz->getEditBox();
if (NULL != pEditBox && 0 != pEditBox->getScriptEditBoxHandler())
{
CommonScriptData data(pEditBox->getScriptEditBoxHandler(), “changed”,pEditBox);
ScriptEvent event(kCommonEvent,(void*)&data);
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
memset(data.eventName, 0, sizeof(data.eventName));
strncpy(data.eventName, “ended”, sizeof(data.eventName));
event.data = (void*)&data;
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
memset(data.eventName, 0, sizeof(data.eventName));
strncpy(data.eventName, “return”, sizeof(data.eventName));
event.data = (void*)&data;
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event);
}
#endif

});

}

路过,学习了