2011-10-22 76 views
1

我想從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 ++使用這個環境?或者如果我錯了(也可能是這樣),有人可以告訴我爲什麼我得到這些錯誤嗎?

在此先感謝!

回答

1

0x8664是DLL的COFF標頭中的IMAGE_FILE_MACHINE_AMD64(其描述爲「x64」)常量。所以基本上GCC確實說它不支持x64 DLL。

關於第二部分,在搜索了一下之後,當您的編譯器未使用x86-x64支持進行編譯時,發現您收到此錯誤消息(「抱歉,未實現:未編譯爲64位模式」)。

可能有兩種解決方案:一種是切換到x86 DLL/JDK。或者兩個,爲Cygwin編譯GCC,支持x86-x64。

所以簡短的回答是:不,這是不可能與您當前的環境做到這一點。

+0

嗨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

+0

始終使用整個工具鏈。如果您使用x64 gcc,請使用x64 nm。關於系統標題,你能發佈確切的錯誤嗎? – lesderid

+0

用cygwin(mingw)構建一個x64應用程序:http://stackoverflow.com/questions/873812/how-to-compile-existing-posix-code-for-64-bit-windows – lesderid

相關問題