Cocos2d-x3.3RC0通过JNI实现Java与C++互调(二)

2015-01-27 14:05:40 · 作者: · 浏览: 316
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);
}
#endif
test.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