触碰插页式广告时的应用"unfortunately stopped"

app "unfortunately stopped" when touching interstitial ads

本文关键字:应用 unfortunately stopped      更新时间:2023-10-16

我使用的是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)

有人能帮忙吗?(对不起英文:)

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

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();
    }
}

由于这是一个SIGSEGV崩溃,显然与您的java代码无关,问题出现在C++方面。

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

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

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

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

还没弄清楚原因呢!

我用这种方式修复了它:

    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);
}