cocos2dx 应用程序调用已有的android程序,cocos2dx-JniHelper 使用(示例代码)

1.操作的游戏工程和cocos2d_x游戏引擎是一个目录的

2.跟jni相关的C++代码文件放在proj.android\jni\hellocpp目录下,每加一个cpp文件,都需在proj.android\jni的Andriod.mk文件中添加:

LOCAL_SRC_FILES := hellocpp/main.cpp             hellocpp/test.cpp \

...

3.跟jni相关的java代码文件放在proj.android\src\jt\SwordsMen目录下

一、C++调用Andriod接口

1.定义一个.h文件“test.h”,内容:

extern "C" //因为jni将java代码转过来是c的,所以C++引用得加上

{

void showExitPt(const char *title, const char *msg); //showExitPt将调用Andriod工程中实现的方法

}

2.定义一个.cpp文件“test.cpp”,内容:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#include #include "platform/android/jni/JniHelper.h"...

//表示proj.android\src\jt\SwordsMen\JniTestHelper.java的,在该文件里有showTipDialog的实现

#define CLASS_NAME "jt/SwordsMen/JniTestHelper"

//事实上,showExitPt一般都是跟showTipDialog同名的,这里为了区分,写成不一样

void showExitPt(const char *title, const char *msg) {

JniMethodInfo t;

//getStaticMethodInfo判断是否在java中实现了名字showTipDialog的方法

//"(Ljava/lang/String;Ljava/lang/String;)V" 对该方法的一个描述,详见说明 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);     //根据该方法的返回值调用对应的CallStaticxxxMethod方法,如CallStaticIntMethod

t.env->CallStaticVoidMethod(t.classID, t.methodID, jTitle, jMsg);

t.env->DeleteLocalRef(jTitle);

t.env->DeleteLocalRef(jMsg);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

3.java实现,代码如下,具体代码最后一定提供

定义一个JniTestHelper.java文件,内容:

48304ba5e6f9fe08f3fa1abda7d326ab.png

private static void showTipDialog(final String title, finalString text)

{

Message msg =mHandler.obtainMessage();

msg.what =SwordsMen.SHOW_DIALOG;

DialogMessage dm = newDialogMessage();

dm.title =title;

dm.msg =text;

msg.obj =dm;

msg.sendToTarget();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

4.程序使用

48304ba5e6f9fe08f3fa1abda7d326ab.png

//需要宏处理,否则so文件生成会有问题

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

#endif

voidCMainScene::exitGame()

{

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)showExitPt("Prompt", "if Exit Game ?");

#endif

#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)ExitDlg *pDlg =ExitDlg::create();

addChild(pDlg, 2);

#endif}

48304ba5e6f9fe08f3fa1abda7d326ab.png

二、Andriod调用C++接口

1.在test.cpp中加入实现内容:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#include "cocos2d.h"

void setPackageName(const char *packageName)

{

CCLog("packageName: %s", packageName);

}

voidexitApp()

{

CCDirector::sharedDirector()->end();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.Andriod工程中的声明(JniTestHelper.java):

public static native voidsetPackageName(String packageName);

public static native void exitApp();

3.将C++实现与Andriod工程中的声明关联(test.cpp)

48304ba5e6f9fe08f3fa1abda7d326ab.png

//1.Java_:是格式,必须加的

//2.jt_SwordsMen_JniTestHelper:是路径proj.android\src\jt\SwordsMen\JniTestHelper.java去掉proj.andriod\src的部分

//3.setPackageName:是Andriod工程中声明的名字

//4.中间需要_分开 void Java_jt_SwordsMen_JniTestHelper_setPackageName(JNIEnv *env, jobject thiz, jstring packageName)

{

const char *pkgName = env->GetStringUTFChars(packageName, NULL);

setPackageName(pkgName);

env->ReleaseStringUTFChars(packageName, pkgName);

}

void Java_jt_SwordsMen_JniTestHelper_exitApp(JNIEnv *env, jobject thiz)

{

exitApp();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

4.程序调用:

JniTestHelper.exitApp();

JniTestHelper.setPackageName(this.getPackageName());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值