public class MyActivity extends AppCompatActivity {
static {
System.loadLibrary("mylib");
}
public native void startActivityFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 调用JNI方法
startActivityFromJNI();
}
}
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "MyActivity"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL
Java_com_example_myapp_MyActivity_startActivityFromJNI(JNIEnv *env, jobject obj) {
jclass activityClass = (*env)->FindClass(env, "android/app/Activity");
jmethodID startActivityMethod = (*env)->GetMethodID(env, activityClass, "startActivity",
"(Landroid/content/Intent;)V");
jclass intentClass = (*env)->FindClass(env, "android/content/Intent");
jmethodID intentConstructor = (*env)->GetMethodID(env, intentClass, "<init>", "(Landroid/content/Context;Ljava/lang/Class;)V");
jclass classClass = (*env)->FindClass(env, "java/lang/Class");
jmethodID forName = (*env)->GetStaticMethodID(env, classClass, "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
jmethodID getApplicationContext = (*env)->GetMethodID(env, activityClass, "getApplicationContext", "()Landroid/content/Context;");
// 获取Activity的Context
jobject context = (*env)->CallObjectMethod(env, obj, getApplicationContext);
// 获取目标Activity的Class对象
jstring className = (*env)->NewStringUTF(env, "com.example.myapp.OtherActivity");
jclass clazz = (*env)->CallStaticObjectMethod(env, classClass, forName, className);
// 创建Intent对象
jobject intent = (*env)->NewObject(env, intentClass, intentConstructor, context, clazz);
// 启动Activity
(*env)->CallVoidMethod(env, obj, startActivityMethod, intent);
}