【问题标题】:app "unfortunately stopped" when touching interstitial ads触摸插页式广告时应用“不幸停止”
【发布时间】:2015-02-05 15:31:37
【问题描述】:

我正在使用 cocos2d-x 3.2,我想在用户触摸屏幕时显示插页式广告。 但是当我触摸屏幕时,我收到了“不幸停止”的消息。 这是我的代码:

Java:

       @Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

final String ADMOB_ID = "ca-app-pub-0000000000000000/0000000000";
interstitial = new InterstitialAd(this);
interstitial.setAdUnitId(ADMOB_ID);

AdRequest.Builder builder = new AdRequest.Builder();
AdRequest adRequest = new AdRequest.Builder().addTestDevice("3A34952B128D8DC19CCB75CA752ED31B").build();

interstitial.loadAd(adRequest);
}

public void showad() { 
    interstitial.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            interstitial.show();
        }
    });
    }
;

C++:

bool HelloWorld::onTouchBegan(cocos2d::Touch *touch , cocos2d::Event *event){

    show();
}

void HelloWorld::show(){
       cocos2d::JniMethodInfo methodInfo;

        if (! cocos2d::JniHelper::getMethodInfo(methodInfo, "org/cocos2dx/cpp/AppActivity", "showad", "()V")) {
            return;
        }

        methodInfo.env->CallVoidMethod(methodInfo.classID, methodInfo.methodID);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
}

我在 logcat 中遇到了这个错误:

A/libc(6628): Fatal signal 11 (SIGSEGV) at 0x00020004 (code=1), thread 6643 (Thread-553)

有人可以帮忙吗?(对不起英语:))

【问题讨论】:

    标签: java android c++ admob cocos2d-x


    【解决方案1】:

    您必须先加载广告,然后再显示它:

    private boolean adIsLoaded = false;
    
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    
        final String ADMOB_ID = "ca-app-pub-0000000000000000/0000000000";
        interstitial = new InterstitialAd(this);
        interstitial.setAdUnitId(ADMOB_ID);
    
        AdRequest.Builder builder = new AdRequest.Builder();
        AdRequest adRequest = new AdRequest.Builder().addTestDevice("3A34952B128D8DC19CCB75CA752ED31B").build();
        interstitial.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                adIsLoaded=true;
            }
        });
    
        interstitial.loadAd(adRequest);
    
    }
    
    public void showad() { 
        if (adIsLoaded)
                interstitial.show();
        }
    }
    

    【讨论】:

    • 我的应用仍然崩溃。
    【解决方案2】:

    由于是SIGSEGV崩溃,显然与你的java代码无关,问题出现在C++端。

    检查HelloWorld::show(),在每行之间打印日志以找出导致崩溃的行。这听起来很愚蠢但很有效。

    顺便说一句,您必须分析崩溃点附近的整个日志,而不是崩溃时的行。

    【讨论】:

      【解决方案3】:

      尝试改用 getStaticMethodInfo() 和 CallStaticVoidMethod()。还要让 showad() 成为一个静态函数。

      对我来说效果很好。但是当我使用 getMethodInfo() 和 CallVoidMethod() 以及非静态 java 函数时,代码既不工作也不崩溃。它根本不做任何事情。

      还没弄清楚原因!

      【讨论】:

        【解决方案4】:

        我是这样修好的:

            private static AppActivity _appActiviy;
               @Override
            protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
        
            final String ADMOB_ID = "ca-app-pub-0000000000000000/0000000000";
            interstitial = new InterstitialAd(this);
            interstitial.setAdUnitId(ADMOB_ID);
        
            AdRequest.Builder builder = new AdRequest.Builder();
            AdRequest adRequest = new AdRequest.Builder().addTestDevice("3A34952B128D8DC19CCB75CA752ED31B").build();
        
            interstitial.loadAd(adRequest);
            }
        
            public static void showAd(){
            _appActiviy.runOnUiThread(new Runnable()
            {
        
            @Override
             public void run(){ 
                 if (_appActiviy.interstitial.isLoaded())
                    {_appActiviy.interstitial.show();}
        
        };
        });}
        

        c++

        bool HelloWorld::onTouchBegan(cocos2d::Touch *touch , cocos2d::Event *event){
        
            show();
        }
        
        void HelloWorld::show(){
               cocos2d::JniMethodInfo methodInfo;
        
                if (! cocos2d::JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/cpp/AppActivity", "showAd", "()V")) {
                    return;
                }
        
                methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
                methodInfo.env->DeleteLocalRef(methodInfo.classID);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-30
          • 1970-01-01
          相关资源
          最近更新 更多