e.cpp中包含如下头文件,并在menuCloseCallback中添加如下代码:
//头文件包含,判断平台
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../proj.android/jni/hellocpp/test.h"//一定是相对路径
#endif
//调用C++调用Java层代码
void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
showTipDialog("exit","Exit,Really Go?");
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
4、Jni层代码
打开ADT工程目录下的jni/hellocpp/列表,在hellocpp下添加c++类,test.cpp和test.h。代码如下:一定包含extern "C"
//test.h
#ifndef TEST_H_
#define TEST_H_
extern "C"
{
void showTipDialog(const char* title,const char* msg);
}
#endiftest.cpp代码如下:
//test.cpp
#include "test.h"
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"//引擎提供的JniHelper类
#include "../../../Classes/JniTest.h"//相对路径,上一步在Xcode中创建的类
#include
#define CLASS_NAME "org/cocos2dx/cpp/JniTestHelper"//这步的路径即是上面红线的路径,很重要
using namespace cocos2d;
extern "C"
{
//下面的函数通过Jni调用Java层的函数。 void showTipDialog(const char* title,const char* msg)//在HelloWorldScene中调用该处的此函数,此函数在通过Jni传到Java层
{
//调用Java层JniTestHelper.java中的showTipDialog函数
JniMethodInfo t;
if(JniHelper::getStaticMethodInfo(t,CLASS_NAME,"showTipDialog","(Ljava/lang/String;Ljava/lang/String;)V"))//该函数的意思就是,寻找org/cocos2dx/cpp/JniTestHelper类中有无静态函数showTipDialog,
暂时还没有放出JniTestHelper的代码,稍后。
{
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_JniTestHelper_setPackageName(JNIEnv* env,jobject thiz,jstring packageName)
{
const char* pkgName = env->GetStringUTFChars(packageName,NULL);
setPackageName(pkgName);//C++层代码
env->ReleaseStringUTFChars(packageName,pkgName);
}
void Java_org_cocos2dx_cpp_JniTestHelper_exitApp(JNIEnv* env,jobject thiz)
{
exitApp();//C++层代码
}
}
5、Java层函数
在ADT工程目录src/org.cocos2dx.cpp的目录下添加java类,JniTestHelper.java
1)JniTestHelper.java代码如下:
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxHandler.DialogMessage;
import android.os.Handler;
import android.os.Message;
public class JniTestHelper {
private static Handler mHandler;//Java的Handler传递消息
public static void init(Handler handler) {
JniTestHelper.mHandler = handler;
}
public static native void setPackageName(String packageName);//声明两个静态nativa函数,在Jni中test.cpp中定义,调用C++层的对应函数。
public static native void exitApp();
private static void showTipDialog(final String title,final String text)
{
Message msg = mHandler.obtainMessage();//接受消息
msg.what = AppActivity.SHOW_DIALOG;
DialogMessage dm = new DialogMessage(title, text);//重点是这一步,之前的教程自己定的数据结构,而新版本的Cocos的
dm.titile = title; //Jni库为我们提供了DialogMessage这个数据结构类。所以不用自定义
dm.message = text;
msg.obj = dm;
msg.sendToTarget();
}
}2)AppActivity.java代码
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxHandler.DialogMes