在开发过程中,可能会遇到需要在游戏中访问互联网地址,比如跳转到商店评价,打开官方网站等。因为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了?借这个开发自定义方法的机会,学习到了跨平台开发的技术,收获不少。
- 本文固定链接: https://freemanapp.com/zh/?p=51
- 转载请注明: freeman 于 FreemanApp 发表