我最近一直在玩cocos2dx,有时我需要调用java代码来做一些Android特定的工作。所以我在Java代码中添加一个静态方法,并在方法中调用runOnUiThread来完成这项工作。 C ++调用静态java方法。
它确实工作正常,但有时调用会使触发调用的menuItem闪烁,而在其他时候,它看起来很完美。
我有一个共享功能,代码如下所示,共享按钮(菜单项)有时会在我点击后闪烁。有人能帮助我吗?谢谢!
我记得在某个地方看到了类似的问题,但今天就不能谷歌了......
爪哇
...
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 ++,platform.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();
}
答案 0 :(得分:2)
在你的AppDelegate.cpp
中功能&gt;&gt;&gt; applicationDidEnterBackground
在功能&gt;&gt;&gt; applicationWillEnterForeground
我建议您使用c ++指令来区分iOS和Android的代码片段。
对于Android部分,仅使用PAUSE / RESUME对,对于iOS,请使用您粘贴的那个。
所以它会是
//applicationDidEnterBackground
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
director->pause();
#else
director->pause();
director->stopAnimation();
#endif
//applicationWillEnterForeground
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
director->resume();
#else
director->resume();
director->startAnimation();
#endif
希望这有帮助!
答案 1 :(得分:0)
我在platform.cpp等效
中使用以下代码 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
void onShare() {
cocos2d::JniMethodInfo t;
if (cocos2d::JniHelper::getStaticMethodInfo(t
, NativeActivityClassName
, "onShare"
, "()V"))
{
t.env->CallStaticVoidMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
}
}
#endif
没有闪烁分享按钮,它工作正常。你是通过其他方式打电话的吗?