在 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/