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中的(那樣比較方便),我自己還沒試過,大家可以試試出行效果大概就是如下