JNI JVM run APK из JVM, созданной в C - PullRequest
0 голосов
/ 29 января 2020

У меня есть 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?

...