2015-02-05 102 views
0

我正在使用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) 

誰能幫(對不起英語:))

回答

0

你必須先加載廣告,然後顯示它:

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

我的應用程序仍然崩潰。 – Arashx12 2015-02-06 08:32:56

0

因爲它是一個SIGSEGV崩潰,顯然有什麼可以做你的Java代碼,問題出現在C++的一面。

檢查HelloWorld::show(),在每行之間打印日誌以找出哪條線路導致崩潰。這聽起來很愚蠢但很有效。

順便說一句,你必須分析整個日誌臨近碰撞點,而不是墜毀時的路線。

0

嘗試使用getStaticMethodInfo()和CallStaticVoidMethod()來代替。也讓showad()成爲一個靜態函數。

它對我來說很不錯。但是,當我使用getMethodInfo()和CallVoidMethod()以及非靜態Java函數時,代碼不起作用,也不會崩潰。它根本沒有做任何事情。

還沒有弄清楚原因呢!

0

我固定它以這樣的方式

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); 
} 
相關問題