我想從C++程序創建一個Java虛擬機(JVM)。經過研究,我發現我需要調用JNI_CreateJavaVM方法來實現它。只是嘗試我得到了一塊代碼邁克爾布魯克邁爾在這個問題上發佈It won't create a Java VM (JNI)改變了很少的事情,以避免警告。如何在64位Windows 7上使用cygwin從C++生成Java VM?
#include <jni.h>
#include <iostream>
int main(int argc, char *argv[])
{
char optionStr[] = "-Djava.class.path=./build/java"; //Path to the java source code
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = optionStr;
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
jint ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
std::cout << "JNI_CreateJavaVM returned " << ret << std::endl;
return 0;
}
我編譯以前的程序裏面cygwin的GCC,但我得到了一些鏈接錯誤:
$ gcc main.cpp /cygdrive/c/Progra~1/Java/jdk1.6.0_24/lib/jvm.lib -lstdc++ -o main
/tmp/ccKyd2Xk.o:main.cpp:(.text+0xfa): undefined reference to `_JNI_CreateJavaVM'
collect2: ld returned 1 exit status
爲了檢查我用nm命令的jvm.lib的符號,我得到了一個非常大的這些消息列表:
BFD: /cygdrive/c/Progra~1/Java/jdk1.6.0_24/lib/jvm.lib(jvm.dll): Recognised but
unhandled machine type (0x8664) in Import Library Format archive
nm: jvm.dll: File format not recognized
我可以猜測問題是,Java開發工具包(JVM)是一個64位的。我的操作系統是64位Windows 7,而gcc正在生成一個32位應用程序。所以,我認爲這是不相容的。我試圖也產生在64位應用程序(雖然我寧願具有一個32位的一個),這是結果:
$ gcc -m64 main.cpp /cygdrive/c/Progra~1/Java/jdk1.6.0_24/lib/jvm.lib -lstdc++ -o main
main.cpp:1: sorry, unimplemented: 64-bit mode not compiled in
可有一個建議的方式來achiving具有在C JVM ++使用這個環境?或者如果我錯了(也可能是這樣),有人可以告訴我爲什麼我得到這些錯誤嗎?
在此先感謝!
嗨lesderid,非常感謝您的回答。關於你可能的答案,我想嘗試第二個。然而,我在cygwin中安裝了所有x86_64-w64-mingw32相關的軟件包,但gcc仍然無法以64位生成應用程序。但是我意識到,如果我使用/ bin/x86_64-w64-mingw32-nm而不是nm,則顯示jvm.lib的符號,所以我可以猜測/ bin/x86_64-w64-mingw32-gcc應該能夠生成一個64位的應用程序,但是當我嘗試它無法找到一些系統標題。你知道哪個是在cygwin中生成64位應用程序的正常/簡單的方法嗎? – Charlie
始終使用整個工具鏈。如果您使用x64 gcc,請使用x64 nm。關於系統標題,你能發佈確切的錯誤嗎? – lesderid
用cygwin(mingw)構建一個x64應用程序:http://stackoverflow.com/questions/873812/how-to-compile-existing-posix-code-for-64-bit-windows – lesderid