Недавно я играл с cocos2dx, и иногда мне нужно вызвать код Java, чтобы выполнить какую-то работу, специфичную для Android. Поэтому я добавляю статический метод в код Java и вызываю метод runOnUiThread для выполнения задания. И С++ вызывает статический метод Java.
Это действительно работает нормально, за исключением того, что ИНОГДА вызов заставит элемент меню, который запускает вызов, мигать, в то время как в других случаях он выглядит идеально.
У меня есть функция общего доступа, и код выглядит так, как показано ниже, кнопка общего доступа (пункт меню) иногда мигает после того, как я нажимаю на нее. Кто-нибудь может мне помочь? Спасибо!
Я помню, что где-то видел похожую проблему, но просто не мог сегодня найти ее в Google...
Джава
...
public static void onShare(final int mode, final int score) {
((AppActivity)mContext).runOnUiThread(new Runnable() {
public void run() {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
if(mode == 0) {
sendIntent.putExtra(Intent.EXTRA_TEXT, ((AppActivity)mContext).getResources().getString(R.string.share_content0, score));
}
else {
sendIntent.putExtra(Intent.EXTRA_TEXT, ((AppActivity)mContext).getResources().getString(R.string.share_content1, score));
}
sendIntent.setType("text/plain");
((AppActivity)mContext).startActivity(Intent.createChooser(sendIntent, ((AppActivity)mContext).getResources().getString(R.string.send_to)));
}
});
}
...
C++, платформа.cpp
...
void doShare(int mode, int score) {
JniMethodInfo t;
if( JniHelper::getStaticMethodInfo(t,APPACTIVITY,
"onShare", "(II)V")) {
t.env->CallStaticIntMethod(t.classID, t.methodID, mode, score);
}
}
...
C++, HelloScene.cpp
...
void GameBase::onGameOver(){
...
auto menuShare = MenuItemFont::create(sr->getString(RSTR::share), CC_CALLBACK_1(GameBase::onShare, this));
...
}
...
void GameBase::onShare(Ref* pSender){
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(SOUND_BTN);
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
doShare(this->_mode, this->_best);
#endif /* CC_TARGET_PLATFORM */
}
....
* sr->getString(RSTR::share), это для поддержки нескольких языков, возвращает текст 'Share' в английской среде.
AppDelegate.cpp
void AppDelegate::applicationDidEnterBackground() {
director->pause();
director->stopAnimation();
GameBase *game;
auto scene = director->getRunningScene();
if (game = dynamic_cast<GameBase *>(scene->getChildByTag(TAG_GAMESCENE))) {
game->onSaveProgress();
}
}
void AppDelegate::applicationWillEnterForeground() {
director->resume();
director->startAnimation();
}