В ОС Android я хочу вызывать пользовательский API класса Java из отдельного кода.
Т.е. если есть класс «HelloWorldActivity», который имеет API «getint». Я хотел бы назвать это из родного приложения «nativecaller»
Я нашел сообщение, связанное с этим, однако мне не было ясно, как была осуществлена реализация.
https://groups.google.com/forum/#!topic/android-ndk/_JidHzVWHM8
Итак, вот фрагмент кода:
#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?
Любой вклад приветствуется!
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 для деталей.
Других решений пока нет …