如何在64位Windows 7上使用cygwin从C++生成Java VM?

问题描述:

我想从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 ++使用这个环境?或者如果我错了(也可能是这样),有人可以告诉我为什么我得到这些错误吗?

在此先感谢!

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://*.com/questions/873812/how-to-compile-existing-posix-code-for-64-bit-windows – lesderid