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

标签 c++ gcc java-native-interface cygwin

我正在尝试从 C++ 程序创建 Java 虚拟机 (JVM)。研究后发现需要调用JNI_CreateJavaVM方法来实现。只是为了尝试,我得到了 Michael Bruckmeier 在这个问题中发布的一段代码 It won't create a 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.lib 中的符号,我使用了 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  

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

提前致谢!

最佳答案

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

关于第二部分,经过一番搜索后,我发现当您的编译器未使用 x86-x64 支持进行编译时,您会收到此错误消息(“抱歉,未实现:未编译 64 位模式”)。

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

所以简短的回答是:不,在您当前的环境下不可能做到这一点。

关于c++ - 如何在 64 位 Windows 7 上使用 cygwin 从 C++ 生成 Java VM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7859500/

相关文章:

c++ - Autotools 和 OpenSSL MD5/RAND_bytes 未定义

c++ - 使用 <tr1/regex> 中的 regex_replace 函数时出错

android - 如何解决 Late-enabling CheckJNI?

Android KitKat 模拟器 native 库 JNI 错误(应用程序错误)

c++ - 使用 Nuget 在 Visual Studio 2019 中安装 Boost v1.70

android - gcc 在 arm/android 上

c++ - 后增量与效率的对比C++中的预增量

java-native-interface - JNI可以释放Java层对象吗?

c++ - 如何在 C++ 中翻转 cv::mat?

c++ - main函数有没有可能成为某个类的友元?