参考链接: 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类
3: coocs端使用如下:#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
//头文件包含,判断平台
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../../../proj.android/jni/hellocpp/MyDialog.h" //一定是相对路径
#endifvoid 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; } }