如何查找包

时间:2014-03-09 19:04:49

标签: java c++ java-native-interface

我使用:

创建了一个JVM
Jvm::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所属的包,我该如何找到?或者我如何获取所有加载的包的列表?我不需要找到主要的。我只想列出所有包裹。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不知道这个问题的任何自动魔术解决方案。通常,您需要知道要尝试加载的类的包和名称,除非您使用某种工厂。从理论上讲,你可以将类似this的东西移植到JNI并实现你的目标。这将是丑陋和复杂的,但它应该在C中与在Java中一样好。