通过JNI从C ++发送Intent

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JNI从C ++发送Intent相关的知识,希望对你有一定的参考价值。

我试图从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);
}
答案

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

以上是关于通过JNI从C ++发送Intent的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 Outlook 发送代码片段?

通过 Intent 传递自定义对象列表

将接口从片段传递到kotlin中的活动

片段创建的 Intent 不会触发 onNewIntent

从内存中打开 PNG 文件并通过 TCP 套接字发送

将微调器值从片段传递到活动