cocos2dx 与android函数的相互调用及使用jni

hello大家好 ,之前一阵子一直在忙项目,没怎么发过博文,挺想看看cocos2dx与安卓是如何交互的,所以就学习了一下(因为我是小菜嘛 想多学点东西 嘻嘻!!!)做了这么一个小test,虽然不多代码但小菜弄了许久,发上来给大家分享下

如果有什么错误或建议欢迎大家为我指出来啊 小菜感激不尽。。。

其实一开始是在想如何在cocos2dx中加入广告及第三方sdk,出于这个原因而学习了这个,好啦,开始正题啦!!!

1,首先用cocos2dx建立一个安卓项目,我的项目名称为Host,包名为org.cocos2dx.game,在安卓项目里面新建两个类一个为DialogMessage,只是用于作为变量的存放数据而已,再一个类为JniTestHelper,用于与cocos2dx及c++交互的类。

两个类代码如下:

package org.cocos2dx.game;

/**
author:weihao 
email :[email protected]
date  :2013-10-4
 **/

public class DialogMessage {
	
	public String title;
	public String msg;
}
package org.cocos2dx.game;

import android.os.Handler;
import android.os.Message;

/**
author:weihao 
email :[email protected]
date  :2013-10-4
 **/

public class JniTestHelper {
	
	private static Handler mHandler;
	
	public static void init(Handler handler)
	{
		JniTestHelper.mHandler = handler;
	}
	//java调用c++函数,c++实现
    public static native void setPackageName(String packageName);
    //java调用c++函数,c++实现
    public static native void exitApp();
    
    private static void showTipDialog(final String title, final String text)
    {
    	Message msg = mHandler.obtainMessage();
    	msg.what = Host.SHOW_DIALOG;
    	DialogMessage dm = new DialogMessage();
    	dm.title = title;
    	dm.msg = text;
    	msg.obj = dm;
    	msg.sendToTarget();
    }
    
}


然后在cocos2dx项目中添加函数
JniTest.h(头文件就行了,在里面有实现方法),

接下来是以下实现

JniTest.h

#ifndef JNI_TEST_H
#define JNI_TEST_H

#include "cocos2d.h"

using namespace cocos2d;
//java传来的函数c++实现
void setPackageName(const char *packageName)
{
	CCLog("packageName: %s", packageName);	
}
//java传来的函数c++实现
void exitApp()
{
	CCDirector::sharedDirector()->end();
}
#endif


再在生成的HelloWorldScene.cpp中修改

引入头文件

#include "HelloWorldScene.h"

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "../proj.android/jni/hellocpp/test.h"
#endif

USING_NS_CC;
在menuCloseCallback(CCObject* pSender)实现c++调用java函数
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	showTipDialog("Goto", "Weihao,really go?");
#endif


}
而showTipDialog在test.h,test.cpp里面实现的 就在头文件哪里导入的那个一样 吧test新建在cocos2dx生成的android项目的/proj.android/jni/hellocpp这个路径下
在test的实现如下

test.h

#ifndef TEST_H
#define TEST_H

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

test.cpp

#include "cocos2d.h"
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "test.h"
#include "JniTest.h"

#define CLASS_NAME "org/cocos2dx/game/JniTestHelper"

using namespace cocos2d;

extern "C"
{
void showTipDialog(const char *title, const char *msg)
{
	JniMethodInfo t;
	if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "showTipDialog", "(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);
	}
}
//这里是java回调回来的包名,类名,函数名
void Java_org_cocos2dx_game_JniTestHelper_setPackageName(JNIEnv *env, jobject thiz, jstring packageName)
{
	const char *pkgName = env->GetStringUTFChars(packageName, NULL);
	setPackageName(pkgName);
	env->ReleaseStringUTFChars(packageName, pkgName);
}

void Java_org_cocos2dx_game_JniTestHelper_exitApp(JNIEnv *env, jobject thiz)
{
	exitApp();
}

}

在生成的继承public class Host extends Cocos2dxActivity类中我们需要添加多一个实例化函数,Handler是用于 负责接收,并按计划发送和处理消息

private Handler mHandler = new Handler()
    {         //这里获取消息以及处理响应在这里实现
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what)
			{
			case SHOW_DIALOG:
				DialogMessage dm = (DialogMessage)msg.obj;
				new AlertDialog.Builder(Host.this)
				.setTitle(dm.title)
				.setMessage(dm.msg).setNegativeButton("stay", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						
					}
				})
				.setPositiveButton("over", 
						new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					   //这些都是调用回cocos2dx来做出动作	
						JniTestHelper.exitApp();
					}
				})
				.create().show();
				break;
			}
		}
    };


这样就大体完成了,不过还有最后一步喔,配置android.mk文件

我的配置如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   hellocpp/test.cpp \
				   ../../Classes/AppDelegate.cpp \
				   ../../Classes/JniTest.h \
				   ../../Classes/HelloWorldScene.cpp 
                   
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes                   

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static game_logic_static cocosdenshion_static cocos_extension_static 
            
include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) 
$(call import-module,cocos2dx) 
$(call import-module,extensions)
我是经过cywin生成.so文件后,以及eclipse的生成后apk就成功看到效果了,其实也可以将test合并在HelloWorldScene中的(那样比较方便),我自己还没试过,大家可以试试
出行效果大概就是如下






发布了53 篇原创文章 · 获赞 4 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章