我使用:
创建了一个JVMJvm::Jvm(std::string ClassPath = ".")
{
options = new JavaVMOption[2];
jvm_args.version = JNI_VERSION_1_6;
//JNI_GetDefaultJavaVMInitArgs(&jvm_args);
options[0].optionString = const_cast<char*>("-Djava.compiler=NONE");
options[1].optionString = const_cast<char*>(("-Djava.class.path=" + ClassPath).c_str());
jvm_args.nOptions = 2;
jvm_args.options = options;
jvm_args.ignoreUnrecognized = false;
if (JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &jvm_args))
{
throw std::runtime_error("Failed To Create JVM Instance.");
}
delete[] options;
options = nullptr;
}
现在我想知道是否有办法枚举jar或我的JVM加载的所有包中的所有包。
例如,如果我想加载我要做的主类:
void CallMain()
{
JNIEnv* env = jvm.GetEnv();
jclass MainClass = env->FindClass("mypackage/Main");
if (MainClass)
{
jmethodID MainMethod = env->GetStaticMethodID(MainClass, "main", "([Ljava/lang/String;)V");
if (MainMethod)
{
jclass StringClass = env->FindClass("java/lang/String");
jobjectArray Args = env->NewObjectArray(0, StringClass, 0);
env->CallStaticVoidMethod(MainClass, MainMethod, Args);
}
}
}
正如你所看到的,我必须特定的“mypackage / Main”来加载位于特定包中的main ..
但是,如果我不知道Main所属的包,我该如何找到?或者我如何获取所有加载的包的列表?我不需要找到主要的。我只想列出所有包裹。
有什么想法吗?
答案 0 :(得分:0)
我不知道这个问题的任何自动魔术解决方案。通常,您需要知道要尝试加载的类的包和名称,除非您使用某种工厂。从理论上讲,你可以将类似this的东西移植到JNI并实现你的目标。这将是丑陋和复杂的,但它应该在C中与在Java中一样好。