直接从没有java端的c ++进程调用jni中的android活动

use*_*937 2 c++ java java-native-interface android android-ndk

我正在使用Eclipse并开发一个具有Java编码和jni C++代码的Android应用程序.

我正试图直接从jni开始Java活动而不涉及Java端.有办法吗?

use*_*937 9

好吧我终于找到了怎么做!这是工作!您需要更改的唯一内容是编写包名称和类名称, NewStringUTF例如:NewStringUTF("org.samples.test.MyClass")

注意:app是你的android_app*

JNIEnv *env;
JavaVM* lJavaVM = app->activity->vm;
app->activity->vm->AttachCurrentThread(&env, NULL);

jobject lNativeActivity = app->activity->clazz;
jclass intentClass = env->FindClass("android/content/Intent");
jstring actionString =env->NewStringUTF("Package Name. Class Name");
jmethodID newIntent = env->GetMethodID(intentClass, "<init>", "()V");
jobject intent = env->AllocObject(intentClass);
env->CallVoidMethod(intent, newIntent);
jmethodID setAction = env->GetMethodID(intentClass, "setAction","(Ljava/lang/String;)Landroid/content/Intent;");
env->CallObjectMethod(intent, setAction, actionString);
jclass activityClass = env->FindClass("android/app/Activity");
jmethodID startActivity = env->GetMethodID(activityClass,"startActivity", "(Landroid/content/Intent;)V");
jobject intentObject = env->NewObject(intentClass,newIntent);
env->CallVoidMethod(intentObject, setAction,actionString);
env->CallVoidMethod(lNativeActivity, startActivity, intentObject);
app->activity->vm->DetachCurrentThread();
Run Code Online (Sandbox Code Playgroud)

您还需要在清单中添加此代码:

<activity android:name=".JavaActivity"
          android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    <intent-filter>
        <action android:name="you.package.path.JavaActivity" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

  • app 是结构变量作为 android_main 的参数,如下所示。void android_main(struct android_app* app) (2认同)