2017-04-21 4 views
0

C++을 사용하여 Android 용 cocos2d-x로 게임을 만들고 있습니다. 이제 버튼을 통해 내 게임에서 패키지 이름을 사용하여 다른 Android 앱 (좋아하는 YouTube, Google Play 스토어 등)을 열 수있는 방법을 찾고 있습니다. 나는 주위를 검색하고이 같은 자바 코드에서 수행 될 수 있음을 발견했다 :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 
} 

내 질문이입니다 : 내 네이티브 코드에서 다른 안드로이드 앱을 열 수 (.CPP 파일) 또는 java 측 (.java 파일)에 넣어야합니까? .java 파일에서이 작업을 수행해야한다면 어디서 처리해야합니까? 저는 항상 Visual Studio에서 .cpp 파일로 작업하고 cmd로 컴파일하고 Android Studio에서 에뮬레이터로 실행합니다. Android Studio에서 cocos2d-x로 생성 된 .java 파일로 작업 한 적이 없으며 엔진이 모든 것을 준비하게합니다. 여기 좀 혼란스러워.

업데이트 1 : 나는 다른 앱에있을 때

Abhishek 아리아의 조언 작동하지만 내 게임은 이력서에 추락했다. 내가 다른 사람의 응용 프로그램을 열기 전에 일부 작업을 수행하려고 해요 그리고 그 행동을 제거하고 떠날 경우 아무런 문제없이 실행할 수 있기 때문에 그들은 충돌을 일으킬 수 openApp 기능을 떠나.

내 기대 : 버튼을 누르십시오.> 내 게임을 일시 중지하고 Android에서 튜브 열기 => 뒤로 버튼 => 일시 중지 You Tube and my game.

무슨 일이 : 내가 튜브를 열 수 있지만 뒤로 버튼을 누르면 응용 프로그램이 다운되었습니다.

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

완료!
아직, 필자는 .cpp 파일에 메서드를 만들 때만 C++에서 openOtherApp 메서드를 호출해야합니다.

#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 

} 

은 페이스 북의 호출을 열고 자 openApp(com.facebook.katana);

+0

안녕 @Abhishek 아리아가, 감사 답변을 위해, 그러나, 나는 내 응용 프로그램은 내가 다른 응용 프로그램에있어 누릅니다 때 다시 재개 할 충돌 문제로 실행 내 경기. 자세한 내용은 내 게시물의 ** 업데이트 1 **를 참조하십시오. –

관련 문제