startActivity with ApplicationContext

44 阅读1分钟
/**
 * 从主界面启动Activity (A&B)
 * @param tName
 */
void HandleDex::execAT(jobject mainATObj, const char *tName) {

    LOGD("execAT")
    LOGI("  tName : %s", tName)
   // TACO::getInstance().printMap();
    jobject targetActivityClassObject = TACO::getInstance().get(tName);
   //  TACO::getInstance().printMap();


    CHECK_STEP_JNI_NULL_STATUS(targetActivityClassObject)
    // "android/content/Intent"
    jclass    intentClass               = env->FindClass(mStringConfig->TS_android_content_Intent());
    // "<init>", "(Landroid/content/Context;Ljava/lang/Class;)V"
    jmethodID intentConstructorMethodID = env->GetMethodID(intentClass, mStringConfig->TS_init(), mStringConfig->TS_Intent_init_sign());
    jobject   intentObject              = env->NewObject(intentClass, intentConstructorMethodID, mainATObj, targetActivityClassObject);


    jfieldID newTaskFlag = env->GetStaticFieldID(intentClass, "FLAG_ACTIVITY_NEW_TASK", "I");
    jint newTaskValue = env->GetStaticIntField(intentClass, newTaskFlag);

    jmethodID setFlagsMethod = env->GetMethodID(intentClass, "setFlags", "(I)Landroid/content/Intent;");
    jobject intentWithFlagsObj = env->CallObjectMethod(intentObject, setFlagsMethod, newTaskValue);

//    CHECK_STEP_JNI_NULL_STATUS(targetActivityClassObject)
    jclass    targetActivityClass  = env->GetObjectClass(targetActivityClassObject);
    // "newInstance", "()Ljava/lang/Object;"
    jmethodID newInstanceId        = env->GetMethodID(targetActivityClass,
                                                      mStringConfig->TS_newInstance(),
                                                      mStringConfig->TS_Ljava_lang_Object());
    auto      targetActivityObject = (jobject) env->CallObjectMethod(targetActivityClassObject, newInstanceId);
    // activity jclass.
    jclass    targetActivityJClass = env->GetObjectClass(targetActivityObject);
    CHECK_STEP_JNI_NULL_STATUS(targetActivityJClass)
    printJclassName(NAME(targetActivityJClass),targetActivityJClass);

    jclass    mainATObjectClass     = env->GetObjectClass(mainATObj);
    jmethodID startActivityMethodID = env->GetMethodID(mainATObjectClass, mStringConfig->TS_startActivity(), mStringConfig->TS_startActivity_sign());
    env->CallVoidMethod(mainATObj, startActivityMethodID, intentWithFlagsObj);
    env->DeleteLocalRef(intentClass);
    env->DeleteLocalRef(intentObject);

}