我正在尝试使用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,模式为混合模式。
主函数运行的结果
我使用的系统是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;
吗? - PaulMcKenziejvm.dll
)和相关库必须在路径上。您的错误似乎表明系统找不到这些库。 - PaulMcKenzie