尝试从C ++创建JVM在C ++代码中运行Java代码时遇到问题。
我在macOs中做了一些测试,并且运行良好,但是在Windows中它可以编译,但是当我运行代码时,它会退出而没有任何输出。
下面有一段有关创建JVM的代码。
JavaVMOption jvmopt[1];
jvmopt[0].optionString = (char *)"-Djava.class.path=.";
JavaVMInitArgs vmArgs;
vmArgs.version = JNI_VERSION_1_2;
vmArgs.nOptions = 3;
vmArgs.options = jvmopt;
vmArgs.ignoreUnrecognized = JNI_TRUE;
cout << "START JVM \n";
JavaVM *javaVM;
JNIEnv *jniEnv;
long flag = JNI_CreateJavaVM(&javaVM, (void **)&jniEnv, &vmArgs);
cout << flag << "\n";
if (flag == JNI_ERR)
{
cout << "Error creating VM. Exiting...\n";
return 1;
}
cout << "\nJVM CREATED";
(...)
javaVM->DestroyJavaVM();```
我使用此.bat来编译和执行代码。
Windows
@ECHO OFF
ECHO BUILDING 1/1
g++ ^
-I"C:\Program Files (x86)\Java\jdk1.8.0_202\include" ^
-I"C:\Program Files (x86)\Java\jdk1.8.0_202\include\win32" ^
-L"C:\Program Files (x86)\Java\jdk1.8.0_202\lib"^
-o jvmdemo.exe jvmdemo.cpp -ljvm
ECHO BUILDING [OK]
jvmdemo.exe
我使用此bash在macOs中编译和执行代码,并且工作正常,它提供了所有输出并创建了JVM。
MacOS
#!/bin/bash
echo "BUILDING 1/1"
g++ \
-I/usr/include \
-I$JAVA_HOME/include \
-I$JAVA_HOME/include/darwin \
-I$JAVA_HOME/jre/lib/server/ \
-rpath $JAVA_HOME/jre/lib/server/ \
-o jvmdemo jvmdemo.cpp $JAVA_HOME/jre/lib/server/libjvm.dylib
echo "BUILDING [OK]"
./jvmdemo
正如我说的那样,它在macO上运行完美,但是在Windows中以某种方式可以编译,但是在我运行它时却没有输出,如果我从g ++中删除了-ljvm
,它会给出错误undefined reference to `_imp__JNI_CreateJavaVM@12'
,奇怪,因为它甚至不显示简单的cout
,但如果我注释创建JVM的行,它将给出所有输出。
有什么建议或帮助吗?