cocos2dx 弹出 android 对话框

参考链接:  http://www.2cto.com/kf/201410/347637.html

1:  android端  proj.android/jni/hellocpp/ 下新建MyDialog类

//test.h
#ifndef _MyDialog_H_
#define _MyDialog_H_

extern "C"
{
	void showExitDialog(const char* title,const char* msg);
}
#endif

//MyDialog.cpp
#include "MyDialog.h"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"//引擎提供的JniHelper类
#include "../../../Classes/JNI/JniDialog.h"//相对路径,上一步在Xcode中创建的类

#define CLASS_NAME "org/cocos2dx/cpp/JniDialogHelper"//这步的路径即是上面红线的路径,很重要
using namespace cocos2d;

extern "C"
{
	//下面的函数通过Jni调用Java层的函数。
	//在HelloWorldScene中调用该处的此函数,此函数在通过Jni传到Java层
    //调用Java层JniTestHelper.java中的showExitDialog函数
	void showExitDialog(const char* title,const char* msg)
	{
		JniMethodInfo t;
		//该函数的意思就是,寻找org/cocos2dx/cpp/JniTestHelper类中有无静态函数showExitDialog,暂时还没有放出JniTestHelper的代码,稍后。
		if(JniHelper::getStaticMethodInfo(t,CLASS_NAME,"showExitDialog","(Ljava/lang/String;Ljava/lang/String;)V"))
		{
			jstring jTitle = t.env->NewStringUTF(title);
			jstring jMsg   = t.env->NewStringUTF(msg);
			t.env->CallStaticVoidMethod(t.classID,t.methodID,jTitle,jMsg);
			t.env->DeleteLocalRef(jTitle);
			t.env->DeleteLocalRef(jMsg);
		}
	}

	//以下两个函数,是通过Jni调用C++层的setPackageName和exitApp,Java层的两个函数在JniTestHelper中定义,参数通过JNIEnv传入
	void Java_org_cocos2dx_cpp_JniDialogHelper_setPackageName(JNIEnv* env,jobject thiz,jstring packageName)
	{
		//utf-8
		const char* pkgName = env->GetStringUTFChars(packageName,NULL);
		setPackageName(pkgName);//C++层代码
		env->ReleaseStringUTFChars(packageName,pkgName);
	}

	void Java_org_cocos2dx_cpp_JniDialogHelper_exitApp(JNIEnv* env,jobject thiz)
	{
		exitApp();//C++层代码
	}
}


2: cocos2dx目录 Classes/JNI/ 下新建JniDialog类
#pragma  once

#ifndef __JniDialog__
#define __JniDialog__

#include "cocos2d.h"
USING_NS_CC;

/*
	退出对话框

	@date : 2016.09.26
*/

void setPackageName(const char* packageName)//从Java层传过来的包名在此处打印出来
{
	log("packageName = %s", packageName);
}

void exitApp()//Java层调用C++层的该函数,关闭程序。
{
	Director::getInstance()->end();
}

#endif
3: coocs端使用如下:

//头文件包含,判断平台
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../../../proj.android/jni/hellocpp/MyDialog.h"  //一定是相对路径
#endif

void Game::onKeyReleased(EventKeyboard::KeyCode keycode, Event* event)
{
	auto dictionary = Dictionary::createWithContentsOfFile("xml/jni/ExitApp.xml");
	const char* title = ((CCString*)dictionary->objectForKey("dialog_title"))->getCString();
	const char* message = ((CCString*)dictionary->objectForKey("dialog_message"))->getCString();

	FileUtils::getInstance()->getWritablePath();
	switch (keycode)
	{
	case EventKeyboard::KeyCode::KEY_BACK:
	{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
											 //		showExitDialog("Exit", "Are you sure to Exit");
											 /*
											 jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,
											 然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
											 */
											 showExitDialog(title, message);
#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
											 exit(0);
#endif
	}
		break;
	default:
		break;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值