如何在64位Windows 7上使用cygwin从c++生成Java虚拟机

How to generate a Java VM from C++ using cygwin on a 64-bit Windows 7?

本文关键字:cygwin c++ 生成 虚拟机 Java 64位 Windows      更新时间:2023-10-16

我正在尝试从c++程序创建Java虚拟机(JVM)。经过研究,我发现我需要调用JNI_CreateJavaVM方法来实现它。只是为了尝试,我得到了Michael Bruckmeier在这个问题中发布的一段代码,它不会创建Java VM (JNI)更改很少的东西来避免警告。

#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  

为了检查jvm中的符号。我使用nm命令,得到了这些消息的一个非常大的列表:

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  

有人能建议一种方法来实现JVM在c++中使用这个环境吗?或者万一我错了(也可以),有人能告诉我为什么我得到这些错误吗?

提前感谢!

0x8664是DLL的COFF头中的IMAGE_FILE_MACHINE_AMD64(其描述为"x64")常量。所以基本上GCC确实说它不支持x64 dll。

关于第二部分,在搜索了一下之后,我发现当你的编译器没有使用x86-x64支持编译时,你会得到这个错误消息("对不起,未实现:64位模式未编译")。

有两种可能的解决方案:一,切换到x86 DLL/JDK。或者,为支持x86-x64的Cygwin编译GCC。

所以简短的回答是:不,在你当前的环境下是不可能的