移动基地SDK下载和接入文档链接:http://g.10086.cn/gamecms/wiki/931_1_0/咪咕游戏最新SDK下载及说明
l 集成SDK开发资源包:
SDK目录中包含SDK的资源文件,请复制SDK目录中的所有目录与文件,并拷贝至各自的游戏工程中),如下:
1)拷贝API
A)拷贝Native API
将SDK/libs目录中的文件全部拷贝到游戏libs下。
B)拷贝JAVA API
将SDK/runtime目录文件,直接复制到游戏根目录下,切勿将runtime下面的jar文件放入libs下面编译,否则会报编译错误,例如:bad range…(不同编译环境均需要按照此要求引用此jar,如遇编译问题,请参考章节4)。
Eclipse导入步骤:
1. 如下选择runtime下面的包导入
2. 勾选此项
2)拷贝SDK资源
A)将SDK/res文件夹中的内容拷贝至游戏工程目录中。
B)将SDK/assets文件夹中的所有文件拷贝至游戏相同的工程目录中,不能删除其中的任何文件,否则导致非正常运行。
3)添加SDK提供的Activity引用
将SDK\AndroidManifest.xml.activity.txt中的文本Copy到游戏的AndroidManifest.xml中。注意:不要重复添加Launcher入口,否则会在手机桌面上显示多个游戏图标。
Activity的横竖屏配置(android:screenOrientation),最好设置成游戏主界面的横竖屏设置。
4)添加SDK需要的use-permision
将SDK\AndroidManifest.xml.permision.txt中的文本Copy到游戏的AndroidManifest.xml
注意:不要重复添加use-permision项。
(注意:3和4步骤可以直接拷贝最后我附上的AndroidManifest实例.xml中的代码进行修改即可;proj.android和proj.android/bin目录下的AndroidManifest都要改)
l SDK必选集成接口:
1)游戏应用配置
集成SDK必须先配置游戏运行的必选配置(自定义Application)。此版本SDK需要游戏自定义Application类,加载SDK核心接口内容。
游戏开发者在集成SDK,务必先自定义全局Application。Application里面代码必须包含,下行代码(注意:该接口必须放在Application中进行加载,不可放在Activity的onCreate中):
System.loadLibrary("megjb"); |
示例代码如下:(注意:该类的package路径应用必须与AndroidManifest.xml中的一致,如下代码示例中,黄色标注,否则游戏无法正常启动)。
package cn.cmgame.sdk; public class CmgameApplication extendsApplication { public void onCreate() { System.loadLibrary("megjb"); } } |
AndroidManifest.xml中配置:
xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.cmgame.sdk" android:versionCode="2"android:versionName="1.2"> <applicationandroid:icon="@drawable/icon" android:label="@string/app_name"android:name=".CmgameApplication"> …… |
2)游戏启动画面
集成移动SDK启动画面(按照移动游戏规范,游戏的首个启动画面必须包含移动游戏LOGO),启动画面展现移动LOGO及游戏LOGO。
在AndroidManifest.xml中的主入口Activity配置为GameOpenActivity(即SDK提供的游戏启动画面的Activity)。游戏原来的主入口Activity请添加到res/values/g_strings.xml中的g_class_name字符串中,使得启动画面完成后即启动游戏。
例如:<string name="g_class_name">your.game.ui.Entrystring>
(提示:我的改为org.cocos2dx.cpp.AppActivity,需要对其内容添加如下:
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.os.Bundle;
public class AppActivity extends Cocos2dxActivity {
// protected voidonCreate(Bundle savedInstanceState){
// super.onCreate(savedInstanceState);
// }
static {
System.loadLibrary("cocos2dcpp");
}
}
其中:("cocos2dcpp")的输入来源于:游戏包前身.so文件,如下图:
3.文档中没有说到的可能错误(这条内容来自:http://blog.csdn.net/xiechyun/article/details/44674895)
至此,游戏应该是可以启动后显示移动页面后转到helloworld界面的啦
eclipse->run 此时发现,assets文件夹下加进来的文件都丢了,libs\armeabi下的libmegjb.so文件也丢了,程序启动不起来,提示如下
网上找了半天也不见一个靠谱答案,最后发现assets文件夹下文件丢失的原因是build_native.py下有这么一个函数
defcopy_resources(app_android_root):
# remove app_android_root/assets ifit exists
assets_dir = os.path.join(app_android_root, "assets")
if os.path.isdir(assets_dir):
shutil.rmtree(assets_dir)
# copy resources
os.mkdir(assets_dir)
resources_dir = os.path.join(app_android_root, "../Resources")
if os.path.isdir(resources_dir):
copy_files(resources_dir, assets_dir)
原来每次build后都会把这个文件夹用Resources替换一遍,我尝试了把sdk下的assets文件同时拷贝到Resources下和proj.android的assets文件夹下,但是编译后我发现proj.android下的文件夹都被删除了,个中原因我也不明。所以,我把build_native.py文件中的这两句注释掉了。
生成一个APK我分两步
1.不注释下面两行,在eclipse或命令行运行build_native.py.(运行后会编译生成\libs\armeabi\libcocos2dcpp.so文件,你的程序做过修改就要重新build这个文件)。
2.注释下面两行,在eclipse下运行run as android application或命令行compile生成apk文件。
(运行第一步后会把assets下的文件和libmegjb.so重新复制到相应目录下再继续第2步)。
# if os.path.isdir(assets_dir):
# shutil.rmtree(assets_dir)
再次编译运行,OK了,跳出了移动的界面,点击 “进入游戏 ”后进入到 helloworld界面,至于为什么改好了assets的删除问题后libs\armeabi下的libmegjb.so文件也不删除了,这个原因我也不明。
当当~在做完以上的东西以后,打包出来就可以看到移动进入游戏的界面了,只不过这时候你的游戏其实还和移动SDK没啥关系,只是点击进入游戏以后可以进入自己的游戏罢了。
于是接下来我想要添加一些功能在游戏中,但是我发现我只要在AppActivity.java代码中添加了下图这句:
重新打包后出现了闪退的问题。
在网上搜索和各种尝试后:
我把CMBilling.jar包放入了libs路径下,重新导入:(也许这不是必须的)
然后build all结束后,在run as application之前把下图的勾选去掉。
打出的包就是不会闪退的版本了。
付费功能简单做法:
在AppActivity.java中加入:
// 计费结果的监听处理,合作方通常需要在收到SDK返回的onResult时,告知用户的购买结果
static GameInterface.IPayCallbackpayCallback = new GameInterface.IPayCallback() {
@Override
public void onResult(int resultCode,String billingIndex, Object obj) {
String result = "";
switch (resultCode) {
case BillingResult.SUCCESS:
result = "购买道具:[" + billingIndex + "] 成功!";
break;
case BillingResult.FAILED:
break;
default:
break;
}
Toast.makeText(sContext, result,Toast.LENGTH_SHORT).show();
}
};
public static void bill_game() {
GameInterface.doBilling(sContext, true,false, "001", null, payCallback);
}
然后再游戏代码中需要调用付费功能的函数中加入:
#if (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID)
JniMethodInfo minfo;
bool isHave =JniHelper::getStaticMethodInfo(minfo,"org.cocos2dx.cpp.AppActivity","bill_game","()V");
if (isHave)
{
minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID);
}
#endif
返回键按钮功能接入:
在AppActivity.java中加入:
private static boolean isCallExtiGame = false;
public static void exit_game() {
if(isCallExtiGame)
{
return ;
}
isCallExtiGame = true;
GameInterface.exit(sContext, new GameInterface.GameExitCallback() {
@Override
public void onConfirmExit() {
System.exit(0);
}
@Override
public void onCancelExit() {
isCallExtiGame = false;
}
});
}
然后在场景的init函数中加入:
auto listenerReturn =EventListenerKeyboard::create();
listenerReturn->onKeyReleased=[&](EventKeyboard::KeyCode keyCode, Event* event)
{
if(EventKeyboard::KeyCode::KEY_RETURN == keyCode ||EventKeyboard::KeyCode::KEY_ESCAPE == keyCode ||EventKeyboard::KeyCode::KEY_BACKSPACE == keyCode)
{
//Director::getInstance()->end();
//#if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
// exit(0);
//#endif
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfominfo;
bool isHave =JniHelper::getStaticMethodInfo(minfo,"org.cocos2dx.cpp.AppActivity","exit_game","()V");
if (isHave)
{
minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID);
}
#endif
}
};
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerReturn,this);
还有一个不错的链接,推荐大家在接入有问题的的时候看看:http://www.cocoachina.com/bbs/read.php?tid=16805
下面附上我的 AndroidManifest实例.xml
-------------------------------------------------分割线------------------------------------------------------------
android:versionCode="1"
android:versionName="1.0" >
android:targetSdkVersion="17" />
android:label="@string/app_name"
android:name=".CmgameApplication">
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:screenOrientation="portrait">
android:screenOrientation="portrait">
-------------------------------------------------分割线------------------------------------------------------------
OK~就酱紫~