在开发过程中,可能会遇到需要在游戏中访问互联网地址,比如跳转到商店评价,打开官方网站等。因为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了?借这个开发自定义方法的机会,学习到了跨平台开发的技术,收获不少。