在CoCos2dx中如何一起使用admob和google play服务

时间:2015-06-05 09:25:53

标签: admob cocos2d-x google-play-services

我试图在我在Cocos2dx中开发的Android游戏中整合Google付费服务和Admob。但是我收到了这个错误

  

无法执行dex:多个dex文件定义Lcom / google / ads / AdRequest $ ErrorCode;        转换为Dalvik格式失败:无法执行dex:多个dex文件定义Lcom / google / ads / AdRequest $ ErrorCode;

1 个答案:

答案 0 :(得分:4)

我也遇到了同样的问题。这是由于google-play-services和GoogleAdMobAdsSdk之间的冲突....这是我找到的解决方案。 更新您的google-play-services库。 转到您的项目/ cocos2d / plugin / plugins / admob / proj.android / src / org / cocos2dx / plugin /

将文件AdsAdmob.java修改为

 package org.cocos2dx.plugin;

import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;

//import com.google.ads.*;
//import com.google.android.gms.ads.AdRequest.ErrorCode;
import com.google.android.gms.ads.*;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.WindowManager;

public class AdsAdmob implements InterfaceAds{

private static final String LOG_TAG = "AdsAdmob";
private static Activity mContext = null;
private static boolean bDebug = false;
private static AdsAdmob mAdapter = null;

private AdView adView = null;
private String mPublishID = "";
private Set<String> mTestDevices = null;
private WindowManager mWm = null;

private static final int ADMOB_SIZE_BANNER = 1;
private static final int ADMOB_SIZE_IABMRect = 2;
private static final int ADMOB_SIZE_IABBanner = 3;
private static final int ADMOB_SIZE_IABLeaderboard = 4;
private static final int ADMOB_SIZE_Skyscraper = 5;

private static final int ADMOB_TYPE_BANNER = 1;
private static final int ADMOB_TYPE_FULLSCREEN = 2;

protected static void LogE(String msg, Exception e) {
    Log.e(LOG_TAG, msg, e);
    e.printStackTrace();
}

protected static void LogD(String msg) {
    if (bDebug) {
        Log.d(LOG_TAG, msg);
    }
}

public AdsAdmob(Context context) {
    mContext = (Activity) context;
    mAdapter = this;
}

@Override
public void setDebugMode(boolean debug) {
    bDebug = debug;
}

@Override
public String getSDKVersion() {
    return "6.3.1";
}

@Override
public void configDeveloperInfo(Hashtable<String, String> devInfo) {
    try {
        mPublishID = devInfo.get("AdmobID");
        LogD("init AppInfo : " + mPublishID);
    } catch (Exception e) {
        LogE("initAppInfo, The format of appInfo is wrong", e);
    }
}

@Override
public void showAds(Hashtable<String, String> info, int pos) {
    try
    {
        String strType = info.get("AdmobType");
        int adsType = Integer.parseInt(strType);

        switch (adsType) {
            case ADMOB_TYPE_BANNER:
            {
                String strSize = info.get("AdmobSizeEnum");
                int sizeEnum = Integer.parseInt(strSize);
                showBannerAd(sizeEnum, pos);
                break;
            }
            case ADMOB_TYPE_FULLSCREEN:
                LogD("Now not support full screen view in Admob");
                break;
            default:
                break;
        }
    } catch (Exception e) {
        LogE("Error when show Ads ( " + info.toString() + " )", e);
    }
}

@Override
public void spendPoints(int points) {
    LogD("Admob not support spend points!");
}

@Override
public void hideAds(Hashtable<String, String> info) {
    try
    {
        String strType = info.get("AdmobType");
        int adsType = Integer.parseInt(strType);

        switch (adsType) {
            case ADMOB_TYPE_BANNER:
                hideBannerAd();
                break;
            case ADMOB_TYPE_FULLSCREEN:
                LogD("Now not support full screen view in Admob");
                break;
            default:
                break;
        }
    } catch (Exception e) {
        LogE("Error when hide Ads ( " + info.toString() + " )", e);
    }
}

private void showBannerAd(int sizeEnum, int pos) {
    final int curPos = pos;
    final int curSize = sizeEnum;

    PluginWrapper.runOnMainThread(new Runnable() {

        @Override
        public void run() {
            // destory the ad view before
            if (null != adView) {
                if (null != mWm) {
                    mWm.removeView(adView);
                }
                adView.destroy();
                adView = null;
            }

            AdSize size = AdSize.BANNER;
            switch (curSize) {
                case AdsAdmob.ADMOB_SIZE_BANNER:
                    size = AdSize.BANNER;
                    break;
                    //                case AdsAdmob.ADMOB_SIZE_IABMRect:
                    //                    size = AdSize.IAB_MRECT;
                    //                    break;
                    //                case AdsAdmob.ADMOB_SIZE_IABBanner:
                    //                    size = AdSize.IAB_BANNER;
                    //                    break;
                    //                case AdsAdmob.ADMOB_SIZE_IABLeaderboard:
                    //                    size = AdSize.IAB_LEADERBOARD;
                    //                    break;
                    //                case AdsAdmob.ADMOB_SIZE_Skyscraper:
                    //                    size = AdSize.IAB_WIDE_SKYSCRAPER;
                    //                    break;
                default:
                    break;
            }
            adView = new AdView(mContext);
            adView.setAdUnitId(mPublishID);
            adView.setAdSize(AdSize.BANNER);
            AdRequest adRequest= new AdRequest.Builder().build();
            adView.loadAd(adRequest);



            //adView = new AdView(mContext, size, mPublishID);
            //AdRequest req = new AdRequest();

            //                try {
            //                    if (mTestDevices != null) {
            //                        Iterator<String> ir = mTestDevices.iterator();
            //                        while(ir.hasNext())
            //                        {
            //                            request.addTestDevice(ir.next());
            //                        }
            //                    }
            //                } catch (Exception e) {
            //                    LogE("Error during add test device", e);
            //                }
            //
            //                adView.loadAd(request);
            ////                adView.setAdListener(new AdmobAdsListener());
            //
                            if (null == mWm) {
                                mWm = (WindowManager) mContext.getSystemService("window");
                            }
            AdsWrapper.addAdView(mWm, adView, curPos);
        }
    });
}

private void hideBannerAd() {
    PluginWrapper.runOnMainThread(new Runnable() {
        @Override
        public void run() {
            if (null != adView) {
                if (null != mWm) {
                    mWm.removeView(adView);
                }
                adView.destroy();
                adView = null;
            }
        }
    });
}

public void addTestDevice(String deviceID) {
    LogD("addTestDevice invoked : " + deviceID);
    if (null == mTestDevices) {
        mTestDevices = new HashSet<String>();
    }
    mTestDevices.add(deviceID);
}

@Override
public String getPluginVersion() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void queryPoints() {
    // TODO Auto-generated method stub

}

//    private class AdmobAdsListener implements A {
//
//        @Override
//        public void onDismissScreen(Ad arg0) {
//            LogD("onDismissScreen invoked");
//            AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_AdsDismissed, "Ads view dismissed!");
//        }
//
//        @Override
//        public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
//            int errorNo = AdsWrapper.RESULT_CODE_UnknownError;
//            String errorMsg = "Unknow error";
//            switch (arg1) {
//            case NETWORK_ERROR:
//                errorNo =  AdsWrapper.RESULT_CODE_NetworkError;
//                errorMsg = "Network error";
//                break;
//            case INVALID_REQUEST:
//                errorNo = AdsWrapper.RESULT_CODE_NetworkError;
//                errorMsg = "The ad request is invalid";
//                break;
//            case NO_FILL:
//                errorMsg = "The ad request is successful, but no ad was returned due to lack of ad inventory.";
//                break;
//            default:
//                break;
//            }
//            LogD("failed to receive ad : " + errorNo + " , " + errorMsg);
//            AdsWrapper.onAdsResult(mAdapter, errorNo, errorMsg);
//        }
//
//        @Override
//        public void onLeaveApplication(Ad arg0) {
//            LogD("onLeaveApplication invoked");
//        }
//
//        @Override
//        public void onPresentScreen(Ad arg0) {
//            LogD("onPresentScreen invoked");
//            AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_AdsShown, "Ads view shown!");
//        }
//
//        @Override
//        public void onReceiveAd(Ad arg0) {
//            LogD("onReceiveAd invoked");
//            AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_AdsReceived, "Ads request received success!");
//        }
//    }
//
//    @Override
//    public String getPluginVersion() {
//        return "0.2.0";
//    }
//
//    @Override
//    public void queryPoints() {
//        LogD("Admob not support query points!");
//    }

}

此文件已修改为使用google-play-services.jar中的广告类。 然后转到project / cocos2d / plugin / plugins / admob / proj.android / sdk 并使用google-play-services.jar替换GoogleAdMobAdsSdk.jar(您将从google-play-services库中获取)。

然后你可以运行publish.sh然后运行gameDevGuide.sh

稍后,从项目属性中删除google-play-services.jar-&gt; java build path - &gt; libraries

此外,您可以使用此代码在.cpp文件中加载横幅

 auto adMob = dynamic_cast<cocos2d::plugin::ProtocolAds*>(cocos2d::plugin::PluginManager::getInstance()->loadPlugin("AdsAdmob"));
    std::map<std::string,std::string> developer_info;
    std::map<std::string,std::string> ad_info;

    developer_info["AdmobID"] = "YOUR_ID";
    ad_info["AdmobType"] = "1";
    ad_info["AdmobSizeEnum"] = "1";
    adMob->configDeveloperInfo(developer_info);

    adMob->setDebugMode(true);
    cocos2d::plugin::ProtocolAds::AdsPos posAdmob = cocos2d::plugin::ProtocolAds::kPosBottom;
    adMob->showAds(ad_info,posAdmob);

现在构建......这对我有用......真是太棒了!