JavaVM 致命 : Failed to load the jvm library

标签 java c++ jvm

我正在尝试使用 c++ 启动 jvm。这是我的 CmakeLists.txt 和 ny C++ 代码。

我的系统是 macOS Mojave 10.14.6

Java 使用 homebrew cask 安装

openjdk 版本“1.8.0_232”

OpenJDK 运行时环境 (AdoptOpenJDK)(build 1.8.0_232-b09)

OpenJDK 64 位服务器 VM (AdoptOpenJDK)(构建 25.232-b09,混合模式)

cmake_minimum_required(VERSION 3.15)
project(jvm)

set(CMAKE_CXX_STANDARD 14)

include_directories(
        /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/include
        /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/include/darwin
)

link_libraries(
        /System/Library/Frameworks/JavaVM.framework/JavaVM
)

add_executable(jvm main.cpp)
#include <iostream>
#include "jni.h"

using namespace std;

int main() {
    std::cout << "Hello, World!" << std::endl;
    JavaVM *jvm;
    JNIEnv *env;

    JavaVMOption jvmopt[3];
    jvmopt[0].optionString = "-Djava.compiler=NONE";
    jvmopt[1].optionString = "-Djava.class.path=./"; 

    jvmopt[2].optionString=  "-verbose:class";

    JavaVMInitArgs vmArgs;
    vmArgs.version = JNI_VERSION_1_8;
    vmArgs.nOptions = 1;
    vmArgs.options = jvmopt;
    vmArgs.ignoreUnrecognized = JNI_TRUE;

    long  flag = JNI_CreateJavaVM(&jvm, (void **) &env, &vmArgs);
    cout << flag << endl;

    jvm->DestroyJavaVM();
    return 0;
}

主函数运行结果
JavaVM: Failed to load JVM: /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bundle/Libraries/libserver.dylib
JavaVM FATAL: Failed to load the jvm library.

[更新]

问题解决了!!!

原因是我链接了错误的库。

我应该链接 $JAVA_HOME//lib/server/libjvm.dylib

更重要的是,我使用 oracle JDK 而不是 openjdk。也许openjdk有问题!!

最佳答案

解决问题的步骤(JavaVM:无法加载JVM:.../libserver.dylib):

cd /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
cd lib
创建一个软链接(soft link) libjvm.dylib 作为 libserver.dylib:
sudo ln -s ../jre/lib/server/libjvm.dylib libserver.dylib

关于JavaVM 致命 : Failed to load the jvm library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415053/

相关文章:

java - 如何在 wsimport 中映射未知的复杂类型

java - 蛇与梯子 - 在计算机转弯和掷骰子上添加延迟

c++ - 内存管理基础?

android - 编辑 android init.rc 以重新启动第三方守护进程

java - 保留堆的镜像并在执行某些方法后返回它

java - 比较字符串是否具有相同的位数

c++ - 在 C++ 中使用 Json 序列化/反序列化字节数组

java - UseCompressedOops JVM 标志有什么作用,我应该什么时候使用它?

kotlin - 如何在Gradle中强制降级插件版本?

java - 哪种 ruby​​ 类型映射到 jruby 中的 java.io.File?