从 JNI 开始新的 Activity
Start new Activity from JNI
我想使用来自 JNI 的代码
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);
到目前为止,我编写了下一个代码,但我猜从带有参数的构造函数中收到错误?
jclass intentClass = env->FindClass("android/content/Intent");
jstring actionString =env->NewStringUTF("com.test.package.TestActivity");
jmethodID newIntent = env->GetMethodID(intentClass, "<init>", "(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent");
jobject intent = env->NewObject(intentClass,newIntent,context,actionString);
jclass activityClass = env->FindClass("android/app/Activity");
jmethodID startActivity = env->GetMethodID(activityClass,"startActivity", "(Landroid/content/Intent;)V");
env->CallVoidMethod( intent, startActivity);
错误:
JNI DETECTED ERROR IN APPLICATION: JNI NewObjectV called with pending
exception java.lang.NoSuchMethodError: no non-static method
"Landroid/content/Intent;.(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent"
context 和 actionString 参数没问题,并在代码的其他地方使用,所以你能帮我吗我不熟悉 JNI,如果我使用它,出于安全原因并尽量避免 pirac。
谢谢
感谢迈克尔:
答案适用于我想用参数函数中的 jobject 上下文做的事情:
jclass native_context = env->GetObjectClass(context);
jclass intentClass = env->FindClass("android/content/Intent");
jclass actionString = env->FindClass("yourPackage/YourActivity");
jmethodID newIntent = env->GetMethodID(intentClass, "<init>", "(Landroid/content/Context;Ljava/lang/Class;)V");
jobject intent = env->NewObject(intentClass,newIntent,context,actionString);
jmethodID methodFlag = env->GetMethodID(intentClass, "setFlags", "(I)Landroid/content/Intent;");
jobject intentActivity = env->CallObjectMethod(intent, methodFlag, 268435456 );
jmethodID startActivityMethodId = env->GetMethodID(native_context, "startActivity", "(Landroid/content/Intent;)V");
env->CallVoidMethod(context, startActivityMethodId, intentActivity);
我想使用来自 JNI 的代码
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);
到目前为止,我编写了下一个代码,但我猜从带有参数的构造函数中收到错误?
jclass intentClass = env->FindClass("android/content/Intent");
jstring actionString =env->NewStringUTF("com.test.package.TestActivity");
jmethodID newIntent = env->GetMethodID(intentClass, "<init>", "(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent");
jobject intent = env->NewObject(intentClass,newIntent,context,actionString);
jclass activityClass = env->FindClass("android/app/Activity");
jmethodID startActivity = env->GetMethodID(activityClass,"startActivity", "(Landroid/content/Intent;)V");
env->CallVoidMethod( intent, startActivity);
错误:
JNI DETECTED ERROR IN APPLICATION: JNI NewObjectV called with pending exception java.lang.NoSuchMethodError: no non-static method "Landroid/content/Intent;.(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent"
context 和 actionString 参数没问题,并在代码的其他地方使用,所以你能帮我吗我不熟悉 JNI,如果我使用它,出于安全原因并尽量避免 pirac。
谢谢
感谢迈克尔: 答案适用于我想用参数函数中的 jobject 上下文做的事情:
jclass native_context = env->GetObjectClass(context);
jclass intentClass = env->FindClass("android/content/Intent");
jclass actionString = env->FindClass("yourPackage/YourActivity");
jmethodID newIntent = env->GetMethodID(intentClass, "<init>", "(Landroid/content/Context;Ljava/lang/Class;)V");
jobject intent = env->NewObject(intentClass,newIntent,context,actionString);
jmethodID methodFlag = env->GetMethodID(intentClass, "setFlags", "(I)Landroid/content/Intent;");
jobject intentActivity = env->CallObjectMethod(intent, methodFlag, 268435456 );
jmethodID startActivityMethodId = env->GetMethodID(native_context, "startActivity", "(Landroid/content/Intent;)V");
env->CallVoidMethod(context, startActivityMethodId, intentActivity);