gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:44 27 4
gpt4 key购买 nike

我正在尝试通过 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com