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

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

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

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

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

两个类代码如下:

package org.cocos2dx.game;

/**

author:weihao

email :sprite_alu@126.com

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 :sprite_alu@126.com

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

#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中的(那样比较方便),我自己还没试过,大家可以试试

出行效果大概就是如下

170145106.jpg

170145107.jpg

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐