首页 > Cocos > cocos2d-x之道~跨平台访问Url
2015
07-17

cocos2d-x之道~跨平台访问Url

在开发过程中,可能会遇到需要在游戏中访问互联网地址,比如跳转到商店评价,打开官方网站等。因为Android与iOS平台的差异,要实现两个平台上访问Url,最好是分别实现。

先说iOS的,因为代码会相对简单些。我把访问Url的方法放到一个类里,如

class GameHelper{
public:
    void static openURL(const char * url);
};

然后在ios目录下新建GameHelper.mm文件,.mm表示object与c++混合的代码,如

#include "GameHelper.h"
 
void GameHelper::openURL(const char *url){
    NSString *strUrl = [NSString stringWithUTF8String:url];
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:strUrl]];
}

这样后,在游戏中就可以通过这样来打开网页了

GameHelper::openUrl("http://www.csdn.net");

Android端需要调用java代码,因此需要添加jni层,在jni文件夹下新建GameHelper.cpp,代码如下

#include "GameHelper.h"
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
 
using namespace cocos2d;
 
void GameHelper::openURL(const char * url){
	JniMethodInfo minfo;
	bool isHave = JniHelper::getStaticMethodInfo(minfo,
		"com/freeman/cocos2dx/GameHelper","openURL","(Ljava/lang/String;)V");
	if(!isHave){
		//CCLog("jni:openURL 函数不存在");
	}else{
		jstring jurl = minfo.env->NewStringUTF(url);
		minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID,jurl);
	}
}

关于JNI和NDK编程的问题需要大家自己去了解,大概思路就是通过JniHelper找到java的类和java中的方法,然后调用它。麻烦的地方在于需要将const char *类型转换成jstring类型

java端的代码就比较简单了,使用Intent把Url包含起来启动一个新的Activity即可

public class GameHelper{
	private static Activity activity;
 
	public static void setActivity(Activity act){
		activity = act;
	}
 
	public static void openURL(String url){
		assert(activity != null);
 
		Intent i = new Intent(android.content.Intent.ACTION_VIEW);
		i.setData(Uri.parse(url));
		activity.startActivity(i);	
	}
}

因为startActivity需要activity,所以在主activity里添加

GameHelper.setActivity(this);

运行尝试一下,是否已经可以访问所需的Url了?借这个开发自定义方法的机会,学习到了跨平台开发的技术,收获不少。

最后编辑:
作者:freeman
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据