cocos2dx安卓添加百度移动联盟广告

来源:互联网 发布:4选1数据选择器74ls153 编辑:程序博客网 时间:2024/04/29 18:09

最近在用cocos2d-x做一款手机游戏,在向游戏中插入广告时遇到了一些问题

上网找到了 乐此不疲 的文章,过程中报了几个错,记录下来:


1.  在   interAd.showAd(Cocos2dxActivity.this);   这一句报错:

在作用域中,没有任何类型  Cocos2dxActivity    的外层实例可访问。

纠结了很久之后,将语句中的   Cocos2dxActivity   改为自己的类名,比如我的是

public class JumpChicken extends Cocos2dxActivity

就把代码改成   interAd.showAd(JumpChicken.this);


2.改完上面的错误之后编译运行,发现进到显示广告的界面时游戏闪退了,继续观察代码,

  1. bool b = JniHelper::getStaticMethodInfo(minfo,     
  2.         "org/cocos2dx/lib/AdHelper",  
  3.         "showMyAd",  
  4.         "()V"); 
改为
  1. bool b = JniHelper::getStaticMethodInfo(minfo,     
  2.         "org/cocos2dx/JumpChicken/ShowAdHelper",  
  3.         "showMyAd",  
  4.         "()V"); 

具体地址是:proj.android\src\org\cocos2dx\JumpChicken\ShowAdHelper.java
并且在头文件中加入#include <jni/JniHelper.h>

乐此不疲的原文是:

这几天,楼主和我的几个小伙伴完成了一个自己的Android游戏,使用cocos2d-x-.2.1.5 编写的,现在基本上都完工了,但是当进行到发布应用这一步时,本来打算在游戏中添加道具收费的,但是遇到了一些问题,所以只能在里面添加插屏广告了,我们这款游戏添加的是百度移动联盟的,好了,废话少说,现在开始正式的:

首先大家都知道是配置问题,这一块我就不多说了,大家可以到http://munion.baidu.com/about.html#/sdk/mobSdk这个网址去下载,里面有开发者文档,

现在我主要说的是在eclipse里如何添加代码,好了,下面正式开始:

一、当我们在创建Android工程时,大家都自动创建了自己的packageName:比如我的是:

这个包名当我们通过C++层调用Java层代码时是用的到的。

首先,我们需要在这个包下面创建一个class文件,命名为showAdHelper.java

这个文件的内容是:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class ShowAdHelper {  
  2.     private static Handler mHandler;  
  3.       
  4.     public static void init(Handler handler)  
  5.     {  
  6.         ShowAdHelper.mHandler = handler;  
  7.     }  
  8.       
  9.     private static void showMyAd()  
  10.     {  
  11.         Message msg = mHandler.obtainMessage();  
  12.         msg.what = myGame.SHOW_AD;  
  13.         msg.sendToTarget();  
  14.     }  
  15. }  
同时,我们会在这个包下面发现一个文件,这个文件是自动创建的,比如我的myGame.java,这个名称是和你在创建游戏时的命名有关的。在这个文件下面,要做如下修改:

首先,声明一个变量和一个常量:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class myGame extends Cocos2dxActivity{  
  2. ...  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static final int SHOW_AD = 0x0001;  
  2. InterstitialAd interAd;//插屏广告  
  3. ...  
  4. }  
然后还要在写一个初始化插屏广告函数:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public InterstitialAd getAd()  
  2.    {  
  3.        final InterstitialAd interAd1 = new InterstitialAd(this);  
  4.        interAd1.setListener(new InterstitialAdListener(){  
  5.                   
  6.                 @Override  
  7.                 public void onAdClick(InterstitialAd arg0) {  
  8.                     Log.i("InterstitialAd","onAdClick");  
  9.                 }  
  10.   
  11.                 @Override  
  12.                 public void onAdDismissed() {  
  13.                     Log.i("InterstitialAd","onAdDismissed");  
  14.                     interAd = getAd();  
  15.                 }  
  16.   
  17.                 @Override  
  18.                 public void onAdFailed(String arg0) {  
  19.                     Log.i("InterstitialAd","onAdFailed");  
  20.                 }  
  21.   
  22.                 @Override  
  23.                 public void onAdPresent() {  
  24.                     Log.i("InterstitialAd","onAdPresent");  
  25.                 }  
  26.   
  27.                 @Override  
  28.                 public void onAdReady() {  
  29.                     Log.i("InterstitialAd","onAdReady");  
  30.                 }  
  31.                   
  32.             });  
  33.        interAd1.loadAd();  
  34.        return interAd1;  
  35.    }  

同时,我们在onCreate函数中调用一次:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState){  
  2. ...  
  3. interAd = getAd();  
  4. ...  
  5. }  
               创建一个Hendler
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private Handler aHandler = new Handler()  
  2.    {  
  3.     @Override  
  4.        public void handleMessage(Message msg) {  
  5.         switch(msg.what)  
  6.         {  
  7.         case SHOW_AD:  
  8.             //if(isFirst)  
  9.             //{  
  10.                 if(interAd.isAdReady()){  
  11.                     interAd.showAd(Cocos2dxActivity.this);  
  12.                     Log.d("LC","show");  
  13.                 }else{  
  14.                     interAd.loadAd();  
  15.                 }  
  16.                 Log.d("LC","not show");  
  17.             break;  
  18.         }  
  19.     }  
  20.    };  

然后调用ShowAdHelper类中的init函数初始化。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState){  
  2.         super.onCreate(savedInstanceState);  
  3.         //mHandler  = new MainHandler();  
  4.         ShowAdHelper.init(mHandler);  
  5. }  

到这里就已经差不多了,我们只需要在C++层中通过jni调用ShowAdHelper类中的showMyAd函数就行了。

当然也附上代码:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void PublicMethod::loadAndroidAd()  
  2. {  
  3. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台   
  4.     JniMethodInfo minfo;    
  5.     jobject jobj;    
  6.     bool b = JniHelper::getStaticMethodInfo(minfo,     
  7.         "org/cocos2dx/lib/AdHelper",  
  8.         "showMyAd",  
  9.         "()V");  
  10.     jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);    
  11. #endif   
  12. }  

到此就完成了,你可以在想要出广告的地方调用loadAndroidAd函数就行了。

至此,小伙伴们就可以想在哪里展示广告就在哪里展示就行了。

以上就是楼主这几天的心血,当然,我也有一些地方没搞明白,比如,为什么我按照官方demo添加的广告,只在第一次调用时显示,以后调用后,它居然不显示了,但是居然还点的到这个广告,但是有些情况它会显示,比如,当我点击广告后,进入广告,然后退出在进入程序,它显示了,还有,当我按了menu键后在进入程序它也显示了,当然如果有哪位大神知道原因,麻烦告知。

最后,祝大家多多挣大钱。如有错误的地方,大家也可以指出来。


0 0