cocos2dx jni 调用java,cocos2dx 与android函数的互相调用及使用jni
cocos2dx 与android函数的相互调用及使用jni哈喽大家好 ,之前一阵子一直在忙项目,没怎么发过博文,挺想看看cocos2dx与安卓是如何交互的,所以就学习了一下(因为我是小菜嘛 想多学点东西 嘻嘻!!!)做了这么一个小test,虽然不多代码但小菜弄了许久,发上来给大家分享下如果有什么错误或建议欢迎大家为我指出来啊 小菜感激不尽。。。其实一开始是在想如何在cocos2dx中加入广告及第
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中的(那样比较方便),我自己还没试过,大家可以试试
出行效果大概就是如下
更多推荐
所有评论(0)