Java虚拟机致命错误:无法加载jvm库。

3
我正在尝试使用C++启动JVM。下面是我的CMakeLists.txt和C++代码。
我使用的系统是macOS Mojave 10.14.6,使用homebrew cask安装了Java。
Java版本为"1.8.0_232",运行环境为OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_232-b09)。
OpenJDK 64位服务器虚拟机(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出了问题!!


vmArgs.nOptions = 1; -- 这不应该是 vmArgs.nOptions = 3; 吗? - PaulMcKenzie
我尝试了,但还是一样的@PaulMcKenzie - steven chan
嗯,我知道在Windows中,jvm(在Windows的情况下是jvm.dll)和相关库必须在路径上。您的错误似乎表明系统找不到这些库。 - PaulMcKenzie
你知道在Windows中哪个文件与jvm.dll相同吗? - steven chan
问题已解决。我链接了错误的库。我应该链接 $JAVA_HOME//lib/server/libjvm.dylib,此外,我使用的是Oracle JDK而不是OpenJDK。 - steven chan
显示剩余2条评论
2个回答

30

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

cd /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
cd lib
创建一个名为libjvm.dylib的软链接,指向libserver.dylib。
sudo ln -s ../jre/lib/server/libjvm.dylib libserver.dylib

当我尝试启动Apache Directory Studio时,我遇到了“JavaVM:无法加载JVM:/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home/lib/libserver.dylib JavaVM FATAL:无法加载jvm库。”的错误。这个解决方案对我有用。 - Elijah W. Gagne

4
sudo ln -s /Library/Java//JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/lib/libserver.dylib

另外一个对我有用的方法是


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接