2017-04-21 98 views
0

我正在使用C++爲Android安裝cocos2d-x。現在我正在尋找一種方法,通過一個按鈕在遊戲中使用他們的軟件包名稱來打開另一個Android應用程序(喜歡YouTube,Google Play Store,...)。我尋覓了一圈,發現它可以在Java代碼來完成像這樣的東西:如何使用cocos2d-x啓動另一個Android應用程序?

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address"); 
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found 
} 

我的問題是:是否有可能在我的本地代碼打開另一個Android應用程序(.cpp文件)或我必須把它們放在Java方面(.java文件)?如果我必須在.java文件中完成,我應該在哪裏放置它?我總是在Visual Studio中使用.cpp文件,使用cmd進行編譯並在Android Studio上使用模擬器運行,我從來沒有在Android Studio中使用由cocos2d-x生成的.java文件,引擎只是讓一切準備就緒,所以我這裏有點困惑。

更新1:

阿布舍克雅利安人的意見的作品,但我的遊戲墜毀,機上的簡歷時,我在另一個應用程序來的。我試圖在打開其他應用程序之前執行一些操作,它們可能會導致崩潰,因爲如果我刪除這些操作並使其獨立運行,我可以毫無問題地運行它。

我的期望:按下按鈕=>暫停我的遊戲並在Android上打開You Tube =>按返回按鈕=>暫停您的Tube並恢復我的遊戲。

發生了什麼事:我可以打開你的管,但我的應用程序崩潰時,我按下後退按鈕。我從Android Studio中下面的錯誤代碼:

A/libc: Fatal signal 11 (SIGSEGV) at 0x0004fb18 (code=1), thread 1975 (Thread-55)

任何想法,我怎麼能解決這個問題?

我的代碼:

auto imageOpeningAction = CallFunc::create([&]() { 
    mOpeningImage->setEnabled(true); 
    mOpeningImage->setOpacity(255); 
    mOpeningImage->setPosition(menuItem->getPosition()); 
    mOpeningImage->runAction(fullScale); 
}); 
    auto imageClosingAction = CallFunc::create([&]() { 
    mOpeningImage->runAction(reverseScale); 
    mOpeningImage->setOpacity(0); 
    mOpeningImage->setEnabled(false); 
}); 
    auto openAnotherApp = CallFunc::create([&]() { // Open YouTube app 
    HelloWorld::openApp(packageName); 
}); 
runAction(Sequence::create(imageOpeningAction->clone(), DelayTime::create(0.5f), openAnotherApp->clone(), nullptr)); 

你的關注和幫助是非常讚賞。

回答

2

您需要使用JNI來滿足您的需求。

創建一個方法,打開您的AppActivity中的任何應用程序。

public class AppActivity extends Cocos2dxActivity { 

    private static Activity activity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     activity=this; 
    } 

    public static void openOtherApp(String packageName){ 

     Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage(packageName); 
     if (launchIntent != null) { 
      activity.startActivity(launchIntent); 
     } 
    } 
} 

完成!
還沒有,現在只需要從C++調用openOtherApp方法,所以我在.cpp文件中創建了一個方法。

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
#include "platform/android/jni/JniHelper.h" 
#endif 

void openApp(std::string packageName){ 

#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) 

    JniMethodInfo methodInfo; 

    const char* class_name="org/cocos2dx/cpp/AppActivity"; 
    const char* method_name="openOtherApp";  
    const char* parameter= "(Ljava/lang/String;)V"; 

    if (! cocos2d::JniHelper::getStaticMethodInfo(methodInfo, class_name, method_name ,parameter)) { 
     return; 
    } 

    jstring jStringParam = methodInfo.env->NewStringUTF(packageName.c_str()); 

    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID,jStringParam); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

#endif 

} 

想開Facebook的通話openApp(com.facebook.katana);

+0

嗨@Abhishek雅利安人,感謝您的回答,但是,我遇到了我的應用程序崩潰,當我在另一個應用程序,並按下回恢復我的問題遊戲。更多詳情請參閱我的文章中的** Update 1 **。 –

相關問題