使用JNI加载JAVA虚拟机

简介: 使用JNI加载JAVA虚拟机

在C中,直接使用JNI加载虚拟机,也是很有意思的想法。这个工作不难,吾已经完成了。


可用代码参考

用C产生加载JDK产生JVM虚拟机,并运行JAVA的main函数(MACOS/LINUX/WINDOWS)_柳鲲鹏的博客-CSDN博客


WINDOWS

实际上代码也有,一时没有整理(主要是加载库方式不同)。可以参考:


C/C++启动JVM_Dan淡淡的心的博客-CSDN博客_c++ jvm


未测试的代码

 下面这个代码不是我的代码,没有真正测试过。以后有机会再测试。

#include <jni.h>
using namespace std;
int main(const int argc, const char** argv)
{
    JavaVMOption options[7];
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    options[0].optionString = "-XX:+UseG1GC";
    options[1].optionString = "-XX:-UseAdaptiveSizePolicy";
    options[2].optionString = "-XX:-OmitStackTraceInFastThrow";
    options[3].optionString = "-Xmn512m";
    options[4].optionString = "-Xmx2048m";
    options[5].optionString = "-Djava.library.path=natives";
    options[6].optionString = "-Djava.class.path=.;libraries.zip;main.jar";
    std::memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_8;
    vm_args.nOptions = 7;
    vm_args.options = options;
    cout << "start creat jvm!\n";
    long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (status == JNI_ERR)
    {
        return 0;
    }
    cout << "jvm created success\n";
    jclass cls = env->FindClass("main/Main");
    if (cls != NULL)
    {
        jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
        if (mid != NULL)
        {
            jclass clz_string = env->FindClass("java/lang/String");
            jobjectArray result = env->NewObjectArray(2, clz_string, NULL);
            jstring arg0 = env->NewStringUTF("first");
            env->SetObjectArrayElement(result, 0, arg0);
            jstring arg1 = env->NewStringUTF("second");
            env->SetObjectArrayElement(result, 1, arg1);
            env->CallStaticVoidMethod(cls, mid, result);
        }
        else
        {
            cout << "class not found\n";
        }
    jvm->DestroyJavaVM();
    return 0;
}


目录
相关文章
|
3月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
15天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
2月前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
105 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
2月前
|
安全 Oracle Java
edge浏览器加载java插件
edge浏览器加载java插件
|
2月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
62 11
|
2月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
93 11
|
3月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
25 0
|
3月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
31 0
|
3月前
|
Java 数据安全/隐私保护 Windows
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
【Azure Developer】使用Java代码启动Azure VM(虚拟机)
|
3月前
|
存储 Java API
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率
【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率