通过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的主要内容,如果未能解决你的问题,请参考以下文章