在Android OS中,我想从独立代码中调用用户定义的java类API。
即。如果有一个“HelloWorldActivity”类,它有“getint”API。我想从本机应用程序“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应该指向什么?
感谢任何输入!
答案 0 :(得分:1)
Dalvik提供了一个名为dalvikvm
的命令,它与您尝试做的事情相去甚远。它只是libdvm.so
的命令行包装器(try adb shell dalvikvm -help
)。您可以看到源代码here。
尝试快速测试:不要查找您的应用程序类,而是查找您知道的那些内容(例如java/lang/String
)。这将告诉你VM是否能够做任何事情。
在设备上,您的环境BOOTCLASSPATH
已经配置adb shell printenv BOOTCLASSPATH
,但CLASSPATH
不会。将CLASSPATH
环境变量设置为以冒号分隔的.jar或.apk文件列表,而不是目录列表。
您需要以root用户身份运行,以便您的命令行应用程序有权在/data/dalvik-cache
为您的APK创建条目。 (如果此类条目已存在,则您可能不需要是root用户。)
如果某些内容不起作用,请检查logcat输出以获取详细信息。