Как создать виртуальную машину Java из C ++, используя cygwin на 64-битной Windows 7? - PullRequest
1 голос
/ 22 октября 2011

Я пытаюсь создать виртуальную машину Java (JVM) из программы на C ++. После исследования я обнаружил, что для этого мне нужно вызвать метод JNI_CreateJavaVM. Просто чтобы попытаться, я получил фрагмент кода Майкла Брукмайера, размещенный в этом вопросе Это не создаст 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;  
}  

Я компилирую предыдущую программу в gcc внутри cygwin, но получаю некоторые ошибки ссылки:

$ 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 Development Kit (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 ++ с использованием этой среды? Или, если я ошибаюсь (это может быть так же), может кто-нибудь сказать мне, почему я получаю эти ошибки?

Заранее спасибо!

1 Ответ

1 голос
/ 29 октября 2011

0x8664 является константой IMAGE_FILE_MACHINE_AMD64 (ее описание "x64") в заголовке COFF DLL. Так что в основном GCC действительно говорит, что не поддерживает библиотеки x64.

Что касается второй части, после небольшого поиска я обнаружил, что вы получаете это сообщение об ошибке («извините, не реализовано: 64-битный режим не скомпилирован в»), когда ваш компилятор не скомпилирован с поддержкой x86-x64.

Возможны два решения: одно - переход на x86 DLL / JDK. Или два, компиляция GCC для Cygwin с поддержкой x86-x64.

Итак, краткий ответ: нет, это невозможно сделать в вашей текущей среде.

...