cocos2d-x调用android内嵌浏览器打开网页,可以从入口传入网址,C++调用android 的api即可实现。方法也很简单

1.修改“cocos2dx\platform\win32”下的CCApplication.h和CCApplication.cpp,添加函数

头文件声明

voidopenURL(constchar*pszUrl);

cpp文件实现:

voidCCApplication::openURL(constchar*pszUrl)

{

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

  1. }
2.修改“cocos2dx\platform\android”下的CCApplication.h和CCApplication.cpp,添加函数

  1. voidCCApplication::openURL(constchar*pszUrl)
  2. {
  3. JniMethodInfominfo;
  4. if(JniHelper::getStaticMethodInfo(minfo,
  5. "org/cocos2dx/application/ApplicationDemo",
  6. "openURL",
  7. "(Ljava/lang/String;)V"))
  8. {
  9. jstringStringArg1=minfo.env->NewStringUTF(pszUrl);
  10. minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID,StringArg1);
  11. minfo.env->DeleteLocalRef(StringArg1);
  12. minfo.env->DeleteLocalRef(minfo.classID);
  13. }
  14. }
3.在 src\org\cocos2dx\lib”下的Cocos2dxActivity.java,添加如下语句:

  1. privatestaticActivityme=null;
  1. protectedvoidonCreate(finalBundlesavedInstanceState){
  2. ...
  3. me=this;
  4. ...
  5. }
  6. //返回Cocos2dxActivity对象,用于调用函数
  1. public static Cocos2dxActivitygetInstance() {
  2. return me;
  3. }
  4. publicvoidopenURL(Stringurl)
  5. {
  6. Intenti=newIntent(Intent.ACTION_VIEW);
  7. i.setData(Uri.parse(url));
  8. me.startActivity(i);
  9. }
现在就可以在cocos2d-x调用了

首先,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方法签名规则



更多相关文章

  1. android中AudioRecord采集音频的参数说明以及audioTrack的播放
  2. Android下使用dlopen函数动态调用.so链接库
  3. android 开发使用 kotlin 进行点击事件监听和界面跳转,直接传也方
  4. Android Activity的onCreate()函数
  5. Android RectF类的构造函数参数说明
  6. android 读取SD卡或者其他地方文件功能函数
  7. Android Audio代码分析19 - setPosition函数

随机推荐

  1. Android更新页面上的数据的常见三种方法
  2. Android(安卓)解压中文乱码(压缩包内中文
  3. Cocos2d-x Android 环境配置
  4. android JNI笔记
  5. Android Studio 3.6.1下载插件失败
  6. [Android]错误: -source 1.7 中不支持 la
  7. android 中怎样能够清除activity堆栈,也就
  8. 【Android】intent action 跳转到系统应
  9. Android漂亮好看的登陆,注册界面!(有可运行D
  10. android adb 关机实现方式