Вызов Java-кода из автономного нативного кода

В ОС Android я хочу вызвать пользовательский API-интерфейс класса Java из автономного кода.

т.е. если есть класс "HelloWorldActivity", который имеет API "getint". Я хотел бы назвать это из родного приложения "nativecaller"

Я нашел сообщение, связанное с этим, однако мне не было ясно, как была осуществлена ​​реализация. https://groups.google.com/forum/

Итак, вот фрагмент кода:

#include <jni.h> 
#include <cutils/log.h>
#include <stdlib.h>
int main(){
    JavaVM *jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
   options[0].optionString = "-Djava.class.path=/data/";
   vm_args.version = JNI_VERSION_1_6;
   vm_args.options = options;
   vm_args.nOptions = 1;    
   vm_args.ignoreUnrecognized = JNI_FALSE;

   /* Create the Java VM */    
   int res = JNI_CreateJavaVM(&jvm, &env, &vm_args); 

   if(!res){    
           /* invoke the Main.test method using the JNI */    
           jclass cls = env->FindClass("com/abc/mypackage/HelloWorld"); //it is not able to find the class

        if(!cls)LOGE("\n\n\nclass not found!!!");    
         else{
           jmethodID mid = env->GetMethodID(cls, "getint", "(V)I");    
           env->CallStaticVoidMethod(cls, mid,10);    
           }

           /* We are done. */    
           jvm->DestroyJavaVM();

    }
   else    
   LOGE("\n\n\n\n CreateJAVAVM failed!!");      
}

FindClass возвращается null,

1. Можно ли получить доступ к классу внутри действия (apk)

2. На что должен указывать -Djava.class.path?

Любой вклад приветствуется!

1 ответ

Решение

Dalvik предоставляет команду под названием dalvikvm, что не слишком далеко от того, что вы пытаетесь сделать. Это просто оболочка командной строки для libdvm.so (пытаться adb shell dalvikvm -help). Вы можете увидеть исходный код здесь.

Попробуйте быстрый тест: вместо того, чтобы искать класс своего приложения, ищите что-то, что, как вы знаете, будет там (скажем, java/lang/String). Это скажет вам, может ли виртуальная машина вообще что-либо делать.

На устройстве BOOTCLASSPATH будет уже настроен в вашей среде (adb shell printenv BOOTCLASSPATH), но CLASSPATH не буду. Установить CLASSPATH Переменная окружения - список файлов.jar или.apk, разделенных двоеточиями, а не список каталогов.

Вам нужно будет работать от имени пользователя root, чтобы приложение командной строки имело право создавать записи в /data/dalvik-cache для вашего APK. (Если такая запись уже существует, вам не нужно быть пользователем root.)

Если что-то не работает, проверьте вывод logcat для деталей.

Другие вопросы по тегам