У меня есть APK, который регистрирует имя пакета:
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test(getApplication());
}
public static void test(Object app) {
if(app == null)
Log.i("APP", "null");
else
Log.i("APP", app.getClass().getName());
Log.i("APP", ((Application) app).getPackageName());
}
}
Я хочу запустить APK этой MainActivity или сам MainActivity в JVM, созданной с помощью JNI & NDK:
Java
VMOption opt[4];
opt[0].optionString = "-Djava.class.path=/data/app.apk";
opt[1].optionString = "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
opt[2].optionString = "-Djava.library.path=/data/";
opt[3].optionString = "-verbose:jni";
JavaVMInitArgs args;
args.version = JNI_VERSION_1_6;
args.options = opt;
args.nOptions = 4;
args.ignoreUnrecognized = JNI_FALSE;
...
if (JNI_CreateJavaVM(jvm, (void **)env, &args) != JNI_OK) {
return -4;
}
if (registerNatives(*env)) {
return -5;
}
...
jclass activityThread = env->FindClass("android/app/ActivityThread");
jmethodID currentActivityThread = env->GetStaticMethodID(activityThread, "currentActivityThread", "()Landroid/app/ActivityThread;");
jobject at = env->CallStaticObjectMethod(activityThread, currentActivityThread);
jmethodID getApplication = env->GetMethodID(activityThread, "getApplication", "()Landroid/app/Application;");
jclass application = env->FindClass("android/app/Application");
jobject app = env->NewObject(application, getApplication);
if(app == 0 || app == NULL){
__android_log_print(ANDROID_LOG_INFO, "APP", "getApplication failed");
}
jclass mainActivity = env->FindClass("com/example/app/MainActivity");
jmethodID test = env->GetStaticMethodID(mainActivity, "test", "(Ljava/lang/Object;)V");
Проблема в том, что я не знаю, как запустить действие. Я думаю, что это невозможно вообще? Мне нужен действительный контекст для использования android функций API. Вылетает и не поднимает тост. Что я делаю неправильно? Я думаю, что генерация контекста не выполняется правильно.
Любые идеи по достижению действительного контекста из JVM для запуска android функций API или даже полного APK?