参考链接: 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;
}
}