java - 从独立 native 代码调用 java 代码

标签 java android c++ android-ndk dalvik

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

即如果有一个类“HelloWorldActivity”有“getint”API。我想从本地应用程序“nativecaller”中调用它

我找到了与此相关的帖子,但是我不清楚实现是如何完成的。 https://groups.google.com/forum/#!topic/android-ndk/_JidHzVWHM8

下面是代码 fragment :

#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.是否可以在 Activity (apk)中访问类

2.-Djava.class.path应该指向什么?

欢迎任何意见!

最佳答案

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

尝试快速测试:不要查找您的应用程序类,而是查找您知道会在那里的东西(例如,java/lang/String)。这将告诉您虚拟机是否能够执行任何操作。

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

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

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

关于java - 从独立 native 代码调用 java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18741682/

相关文章:

java - 反射清除Android应用程序缓存的方法

c++ - 哔哔声不起作用(linux)

java - 在测验应用程序中设置 3 个难度级别

java - 如何计算不包括周末java的两个日期之间的天数

android, NumberPicker 越界

c++ - 什么时候两个函数模板被认为是部分有序的,什么时候是不明确的?

c++ - 多面体三角剖分失败

java - Play 2.4.2 JavaWs 给出 null

java - 如何修复 JAX-RS 中的 javax.servlet.ServletException : java. lang.NullPointerException?

java - ProGuard 不会混淆蓝牙类