0

在 android 操作系统中,我想从独立代码中调用用户定义的 java 类 API。

即,如果有一个具有“getint”API 的类“HelloWorldActivity”。我想从本机应用程序“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 应该指向什么?

任何输入表示赞赏!

4

1 回答 1

1

Dalvik 提供了一个名为 的命令dalvikvm,它与您尝试执行的操作相距不远。libdvm.so它只是(try adb shell dalvikvm -help)的命令行包装器。您可以在此处查看源代码。

尝试快速测试:与其查找您的应用程序类,不如查找您知道会存在的东西(例如,java/lang/String)。这将告诉你虚拟机是否能够做任何事情。

在设备上,BOOTCLASSPATH将已在您的环境中配置 ( adb shell printenv BOOTCLASSPATH),但CLASSPATH不会。将CLASSPATH环境变量设置为以冒号分隔的 .jar 或 .apk 文件列表,而不是目录列表。

您需要以 root 身份运行,以便您的命令行应用程序有权/data/dalvik-cache为您的 APK 创建一个条目。(如果这样的条目已经存在,您可能不需要是 root。)

如果某些东西不起作用,请检查 logcat 输出以获取详细信息。

于 2013-09-11T21:10:31.037 回答