android - 通过 JNI 从 C++ 发送 Intent

标签 android c++ android-intent java-native-interface

我正在尝试通过 JNI 从 C++ 进行显式 Intent 调用(对特定 pkg 和类的 Intent )。一切都很好,直到我实际尝试发送 Intent 的最后一行:

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

最佳答案

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

关于android - 通过 JNI 从 C++ 发送 Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25167806/

相关文章:

android - 如何暂停在android中捕获视频?

android - PWA 是否可以转换为 Native App?

android - 警报对话框上带有多选复选框的列表?

java - 渲染时出现异常 : com. android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup

c++ - 通过未知大小的外部普通数组进行循环

c++ - QuantLib 构建错误

c# - 从托管应用程序使用 native 注册免费 C++ COM 服务器

android - 需要 Android 的文件保存对话框

Android 阅读邮件 Intent

ANDROID:按下后退按钮后的 Activity 状态