使用JNI将更改的类文件加载到JVM

时间:2017-11-21 03:51:47

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

我正在为Windows开发一个Java IDE,作为一个学习项目,我遇到了一个无法找到解决办法的障碍。

我正在使用JNI来调用JVM并使用javac来编译我的代码。

JVM正常启动,当第一次编译java代码时,JVM从类路径中获取它们并正确运行它。

但是在编辑java文件,编译(使用脚本编译)并运行代码之后,JVM仍然会加载在第一次运行期间编译的类文件。我必须停止整个过程并再次启动JVM才能进行更改。

我知道应该有一种方法可以在Eclipse或IntelliJ等IDE中处理。但我似乎无法找到如何。如果有人可以帮助我,我真的很感激。

我用来查找和加载类文件的代码如下。

bool load(const char* classFile)
{   
    JNIEnv* env;
    bool isAttached = Interpreter::getEnv(&env);
    auto javacls = env->FindClass(classFile);
    if (javacls == nullptr)
    {
        getLogger().error("ERR: Loading class file %s failed", classFile);
        env->ExceptionDescribe();
        return false;
    }
    auto classInstance = getObject(javacls);

    if (classInstance == nullptr)
    {
        getLogger().error("ERR: Invalid Object");
        return false;
    }

    return true;
}

2 个答案:

答案 0 :(得分:0)

您应该在单独的ClassLoader下运行测试下的代码,并在每次编译后使用一个新代码,甚至可以用于每次运行。

您不需要任何JNI。

答案 1 :(得分:0)

我用于此的解决方案是创建一个调用JVM的子进程,然后执行需要完成和退出的所有操作。这样,每次调用子进程时,它都会创建一个新的JVM,因此每次都会加载更改的类文件。