首页 > 代码库 > 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);  

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

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

  1. private static Activity me = null;  
  1. protected void onCreate(final Bundle savedInstanceState) {  
  2.     ...  
  3.     me = this;  
  4.     ...  
  5. }  
  6. //返回Cocos2dxActivity对象,用于调用函数
  1. public staticCocos2dxActivity getInstance() {
  2. returnme;
  3. }
  4. public void openURL(String url)   
  5. {   
  6.       Intent i = new Intent(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方法签名规则