-
JNI 中 JAVA回调C++, 绝不可以直接操作 UI,而是应通过 Director::getInstance()->getScheduler()->performFunctionInCocosThread()运行在COCOS的线程里面来执行。
-
EDITBOX 的安卓包装比较的坑,在回调的时候 通过
Cocos2dxHelper.sCocos2dxHelperListener.runOnGLThread 来放回COCOS线程运行?但自从接了QQ登陆后,再也没法回调 editBoxCallbackFunc 了。
具体原因没有查明,以下是我的规避代码: -
改成JAVA直接回调C++回调函数 nativeSetEditTextDialogResult
-
把 C++ nativeSetEditTextDialogResult 原有代码放到 Director::getInstance()->getScheduler()->performFunctionInCocosThread() 来执行。
-
问题解决。
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
});
}