移动基地SDK接入Cocos2dx手游笔记

移动基地SDK下载和接入文档链接:http://g.10086.cn/gamecms/wiki/931_1_0/咪咕游戏最新SDK下载及说明


集成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下面的包导入

移动基地SDK接入Cocos2dx手游笔记_第1张图片


2.     勾选此项

 移动基地SDK接入Cocos2dx手游笔记_第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都要改)


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文件,如下图:

 移动基地SDK接入Cocos2dx手游笔记_第3张图片


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.androidassets文件夹下,但是编译后我发现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代码中添加了下图这句:

移动基地SDK接入Cocos2dx手游笔记_第4张图片


重新打包后出现了闪退的问题。

在网上搜索和各种尝试后:

我把CMBilling.jar包放入了libs路径下,重新导入:(也许这不是必须的)

移动基地SDK接入Cocos2dx手游笔记_第5张图片

然后build all结束后,在run as application之前把下图的勾选去掉。

移动基地SDK接入Cocos2dx手游笔记_第6张图片


打出的包就是不会闪退的版本了。

 

付费功能简单做法:

在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

-------------------------------------------------分割线------------------------------------------------------------


    package="cn.cmgame.sdk"
    android:versionCode="1"
    android:versionName="1.0" >
 
            android:minSdkVersion="8"
        android:targetSdkVersion="17" />
   
 
 
 
 
 
 
   
   
   
   


            android:allowBackup="true"
        android:label="@string/app_name"
         android:name=".CmgameApplication">
                    android:name="org.cocos2dx.cpp.AppActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:screenOrientation="portrait">
           
       
              android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                android:screenOrientation="portrait">
             
               
               
           

           
               
               
           

   

   



-------------------------------------------------分割线------------------------------------------------------------


OK~就酱紫~


你可能感兴趣的:(移动基地SDK接入Cocos2dx手游笔记)