首页 > 代码库 > cocos2d-x调用android内嵌浏览器打开网页
cocos2d-x调用android内嵌浏览器打开网页
cocos2d-x调用android内嵌浏览器打开网页,可以从入口传入网址,C++调用android 的api即可实现。方法也很简单
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);
- }
- 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);
- }
- }
- private static Activity me = null;
- protected void onCreate(final Bundle savedInstanceState) {
- ...
- me = this;
- ...
- }
- //返回Cocos2dxActivity对象,用于调用函数
- public staticCocos2dxActivity getInstance() {
- returnme;
- }
- public void openURL(String url)
- {
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(url));
- me.startActivity(i);
- }
首先,C++要调用java代码,cocos2d-x要调用android的api必须使用到jni库
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#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方法签名规则
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。