【问题标题】:How to launch another Android app using cocos2d-x?如何使用 cocos2d-x 启动另一个 Android 应用程序?
【发布时间】:2017-04-21 02:40:42
【问题描述】:

我正在使用 C++ 为 Android 制作一个带有 cocos2d-x 的游戏。现在我正在寻找一种方法来打开另一个 Android 应用程序(如 YouTube、Google Play 商店等),通过一个按钮从我的游戏中使用他们的包名。我四处搜索,发现它可以用 Java 代码完成,如下所示:

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

我的问题是:是否可以在我的本机代码(.cpp 文件)中打开另一个 Android 应用程序,或者我必须将它们放在 java 端(.java 文件)?如果我必须在 .java 文件中执行此操作,我应该将它放在哪里?我总是在 Visual Studio 中使用 .cpp 文件,使用 cmd 编译并在 Android Studio 上使用模拟器运行,我从未使用过 Android Studio 中由 cocos2d-x 生成的 .java 文件,引擎只是为我准备好了一切,所以我这里有点糊涂了。

更新 1:

Abhishek Aryan 的建议有效,但是当我在另一个应用程序中时,我的游戏在恢复时崩溃了。我正在尝试在打开其他应用程序之前执行一些操作,它们可能会导致崩溃,因为如果我删除这些操作并单独保留 openApp 函数,我可以毫无问题地运行它。

我的期望:按下按钮 => 暂停我的游戏并在 Android 上打开 You Tube => 按下返回按钮 => 暂停 You Tube 并恢复我的游戏。

会发生什么:我可以打开 You 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));

非常感谢您的关注和帮助。

【问题讨论】:

    标签: android-ndk java-native-interface cocos2d-x


    【解决方案1】:

    您需要使用 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);

    【讨论】:

    • 嗨@Abhishek Aryan,感谢您的回答,但是,当我在另一个应用程序中并按返回以恢复我的游戏时,我遇到了我的应用程序崩溃的问题。更多详情请参阅我的帖子中的Update 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多