通过JNI从C ++发送Intent

问题描述 投票:2回答:1

我试图从C ++到JNI进行显式的意向调用(意图到特定的包和类)。一切都很好,直到我实际尝试发送意图的最后一行:

env->CallVoidMethod(obj, startActivity, intentObject);

我没有得到一个android错误,它只是一个完整的转储/堆栈跟踪...这不会给我任何有用的信息。

这是调用启动intent的C ++代码:

JNIEXPORT void JNICALL Java_com_testpkg_test(JNIEnv *java_env, jobject obj) {
    jvm->AttachCurrentThread(&java_env, 0);
    jclass activityClass = java_env->GetObjectClass(obj);
    jmethodID appGetContextId = java_env->GetMethodID(activityClass, "getApplicationContext", "()Landroid/content/Context;");
    jobject appContext = java_env->CallObjectMethod(obj, appGetContextId);

    //Get an instance of Intent
    jclass intentClass = java_env->FindClass("android/content/Intent");
    jmethodID newIntent = java_env->GetMethodID(intentClass, "<init>", "()V");
    jobject intentObject = java_env->NewObject(intentClass, newIntent);
    java_env->CallVoidMethod(intentObject, newIntent);

    //Get an instance of the ComponentName class
    jclass componentClass = java_env->FindClass("android/content/ComponentName");
    jmethodID componentMID = java_env->GetMethodID(componentClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
    jstring pkgName =java_env->NewStringUTF("com.testpkg");
    jstring clsName =java_env->NewStringUTF("com.testpkg.test");
    jobject componentObj = java_env->NewObject(componentClass, componentMID, pkgName, clsName);
    java_env->CallVoidMethod(componentObj, componentMID, pkgName, clsName);

    //Calling intent.setComponentName passing in pkg+class name
    jmethodID setComponentName = java_env->GetMethodID(intentClass, "setComponent","(Landroid/content/ComponentName;)Landroid/content/Intent;");
    java_env->CallObjectMethod(intentObject, setComponentName, componentObj);

    //Call getapplicationcontext().startActivity(intent)
    jmethodID startActivity = java_env->GetMethodID(activityClass, "startActivity", "(Landroid/content/Intent;)V");
    env->CallVoidMethod(obj, startActivity, intentObject);
}
android c++ android-intent java-native-interface
1个回答
1
投票

我发布的评论仍然适用,但这是一个问题 - 不要打电话给java_env->CallVoidMethod(intentObject, newIntent)。 NewObject调用会为您完成。你这样做了两次,它可能会破坏Java的内存管理。

© www.soinside.com 2019 - 2024. All rights reserved.