cocos2d-x调用android内嵌浏览器打开网页,能够从入口传入网址,C++调用android 的api就可以实现。

方法也非常easy

1. 改动“cocos2dx\platform\win32”下的CCApplication.h和CCApplication.cpp。加入函数

头文件声明

void openURL(const char* pszUrl);

cpp文件实现:

void CCApplication::openURL(const char* pszUrl)

{

ShellExecuteA(NULL, "open", pszUrl, NULL, NULL, SW_SHOWNORMAL);

}

2. 改动“cocos2dx\platform\android”下的CCApplication.h和CCApplication.cpp,加入函数

void CCApplication::openURL(const char* pszUrl)

{

JniMethodInfo minfo;

if(JniHelper::getStaticMethodInfo(minfo,

"org/cocos2dx/application/ApplicationDemo",

"openURL",

"(Ljava/lang/String;)V"))

{

jstring StringArg1 = minfo.env->NewStringUTF(pszUrl);

minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, StringArg1);

minfo.env->DeleteLocalRef(StringArg1);

minfo.env->DeleteLocalRef(minfo.classID);

}

}

3.在src\org\cocos2dx\lib”下的Cocos2dxActivity.java。加入例如以下语句:

private static Activity me = null;

protected void onCreate(final Bundle savedInstanceState) {

...

me = this;

...

}

//返回Cocos2dxActivity对象,用于调用函数

public static

Cocos2dxActivity getInstance() {

return

me;

}

public void openURL(String url)

{

Intent i = new Intent(Intent.ACTION_VIEW);

i.setData(Uri.parse(url));

me.startActivity(i);

}

如今就能够在cocos2d-x调用了

首先,C++要调用java代码。cocos2d-x要调用android的api必须使用到jni库

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include

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

#endif

如今在须要调用的地方:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo minfo;

//getStaticMethodInfo。推断Java静态函数是否存在。而且把信息保存到minfo里

//參数1:JniMethodInfo

//參数2:这个类的路径+类名

//參数3:Java函数名称

//參数4:函数參数类型和返回值类型

//返回一个bool,是否找到该函数

bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/yipingtai/org/Webopen","getInstance","()Lcom/yipingtai/org/Webopen;");

jobject jobj;//存对象

if (isHave) {

//这里的调用静态的getInstance,返回web类的对象。

jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);

isHave = JniHelper::getMethodInfo(minfo,"com/yipingtai/org/Webopen","openWebview","(Ljava/lang/String;)V");

if (isHave) {

jstring url = minfo.env->NewStringUTF("http://www.baidu.com");

//调用 openWebview, 參数1:Test对象 參数2:方法ID 參数3:參数

(没有參数就不写了)

minfo.env->CallVoidMethod(jobj, minfo.methodID, url);

}

}

#else

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

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

exit(0);

#endif

#endif

这里用到jni类型签名,简介一下

签名-类型 : Z:bool   B:byte   C:char   S:short   I:int   J:long   F:float   D:double  L:全限定类名   [:数组

类的签名规则是:“L+全限定类名+;” 三部分组成,当中全限定类名以”/”分隔。而不是用“.”或者“_”分隔。

比如java方法:long fun (int n, String str, int[] arr);

签名为:(ILjava/lang/String;[I)J   括号中面的内容分成三部分,之间没有空格,即“I”、“Ljava/lang/String。”和“[I”,分别代表 int、String和int[]。

括号外面是返回值类型签名,J代表long型。

想深入了解,能够百度一下JNI方法签名规则

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐