cocos2d-js引擎在ios和android平台打开网页

//cocos2d -js 在安卓平台打开网页的方法
1、js调用java,首先引擎自己封装了类似jni的东西,这个东西叫做jsb。
jsb.reflection.callStaticMethod(
“org/cocos2dx/xxx/xxx”, //类所在的位置,不用填写后缀
“hello”, //要调用的函数的名字
“(Ljava/lang/String;)V”, //签名,括号里面的是要传递的参数的类型,hello函数;括号外面的是返回值的类型。V表示没有返回值void;I表示int;Z表示布尔。
“hahaha”//要传递的参数可以是字符串,也可以是其他的要符合第三个参数的类型
);
2、第二步就是创建自己的类或者是找到一个类 在里面添加你想要的想过的函数。我一般都放入cocos2d-js-v3.2\Texas_Holdem\frameworks\js-bindings\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib\xxx 这个下面或者是在这个下面的一个文件里修改我想要的东西。

//打开浏览器的函数。需要在文件上导入一个包 import android.net.Uri; 这个函数我添加在了Cocos2dxActivity.java这里。因为在使用startActivity的时候需要用到当前的this,这里的this 被使用了onCreate()函数的时候赋值成了sContext,所以使用sContext就可以了。
public static void openUrl(String url)
{
Uri uri = Uri.parse(url);
Intent it = new Intent(Intent.ACTION_VIEW,uri);
sContext.startActivity(it);
}
在js调用的时候直接使用下面的代码就可以了。
jsb.reflection.callStaticMethod(“org/cocos2dx/lib/Cocos2dxActivity”, “openUrl”, “(Ljava/lang/String;)V”,webUrl); //webUrl是我自己定义的一个string类型的链接地址,如http://www.baidu.com

//cocos2d-js 在ios上打开网页的方法
首先我说一下在iso上打开网页的流程。第一步使用js调用c++的代码,然后从c++的代码在调用oc的代码,oc的代码里面加入源生的打开默认浏览器的函数和功能。
第一步,要在js调用c++代码的地方做出处理。
cocos2d-js-v3.2\xxxx\frameworks\js-bindings\bindings\auto 这个文件夹下面有两个文件一个是jsb_cocos2dx_auto.cpp另外一个是jsb_cocos2dx_auto.hpp。hpp这个东西相当于c++里的.h头文件。
我们需要了解一下这里的大概的功能。首先js调用的C++的函数需要通过这里一个叫做JS_FN的东西来调用具体的函数以及功能。所以我们在cpp里搜索JS_FN看看里面都做一些什么!一个一个搜索我们发现在哎86xx行里的JS_FN这里符合我们要做的事情 所有我们在这里添加一些东西。
JS_FN(“openUrl”, js_cocos2dx_FileUtils_openUrl, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), “openUrl” 这个是函数的名字,被js调用的。
js_cocos2dx_FileUtils_openUrl这个是当前文件cpp和hpp里我们需要添加的函数,你也可以命名成xxx,第三个参数是代表着你这个函数里需要几个参数,第四个参数就不用管他了。
这个写好之后我们去hpp定义函数bool js_cocos2dx_FileUtils_openUrl(JSContext *cx, uint32_t argc, jsval *vp);这样我们的函数就定义好了,接下来返回cpp去实现这个函数。
bool js_cocos2dx_FileUtils_openUrl(JSContext *cx, uint32_t argc, jsval *vp)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
jsval *argv = JS_ARGV(cx, vp);
bool ok = true;
JSObject *obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t proxy = jsb_get_js_proxy(obj);
cocos2d::FileUtils
cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, “js_cocos2dx_FileUtils_openUrl : Invalid Native Object”);
if (argc == 1) {
std::string arg0;
ok &= jsval_to_std_string(cx, argv, &arg0);
JSB_PRECONDITION2(ok, cx, false, “js_cocos2dx_FileUtils_openUrl : Error processing arguments”);
bool ret = true;
myClass::openURL(“http://wecat.cc/register.php”);
jsval jsret = JSVAL_NULL;
jsret = BOOLEAN_TO_JSVAL(ret);
JS_SET_RVAL(cx, vp, jsret);
return true;
}

JS_ReportError(cx, "js_cocos2dx_FileUtils_openUrl : wrong number of arguments: %d, was expecting %d", argc, 1);

#endif
return false;
}
cpp里函数的具体实现,openURL这个是调用oc的方法,方法的内容就是打开ios默认的浏览器,稍后贴出代码。

接下来我们去Classes里创建两个文件,一个是mm文件一个是h头文件。
我们把文件的名字定义成openUrl,下面是mm文件里的代码
bool js_cocos2dx_FileUtils_openUrl(JSContext *cx, uint32_t argc, jsval *vp)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
jsval *argv = JS_ARGV(cx, vp);
bool ok = true;
JSObject *obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t proxy = jsb_get_js_proxy(obj);
cocos2d::FileUtils
cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, “js_cocos2dx_FileUtils_openUrl : Invalid Native Object”);
if (argc == 1) {
std::string arg0;
ok &= jsval_to_std_string(cx, argv, &arg0);
JSB_PRECONDITION2(ok, cx, false, “js_cocos2dx_FileUtils_openUrl : Error processing arguments”);
bool ret = true;
myClass::openURL(“http://wecat.cc/register.php”);
jsval jsret = JSVAL_NULL;
jsret = BOOLEAN_TO_JSVAL(ret);
JS_SET_RVAL(cx, vp, jsret);
return true;
}

JS_ReportError(cx, "js_cocos2dx_FileUtils_openUrl : wrong number of arguments: %d, was expecting %d", argc, 1);

#endif
return false;
}
然后是头文件里的代码
#ifndef CocosJSGame1__openUrl
#define CocosJSGame1__openUrl

#include <stdio.h>
#include

class myClass
{
public:
static void openURL(std::string url);
};

#endif
接下来就是在js里调用c++的代码了
jsb.fileUtils.openUrl(webUrl); 这样就达到了我们的目的。如果有错误 可以联系我。

1赞

mark!!!1:7::7:

:5: :6: :7:

cocos不是有openurl的接口吗?

马而克之!谢谢分享~:9:

MARK 一下。谢谢分享。

以前的版本都不支持手机版本的,现在的最新版本引擎好像是支持的