JNI_CreateJavaVM () завершается с кодом выхода 1

Я пытаюсь вызвать метод Java из C ++, используя JNI. Для этого я установил jdk1.7.0_51, связывая против jdk1.7.0_51\lib\jvm.lib, в том числе jdk1.7.0_51\include а также jdk1.7.0_51\include\win32, используя следующий код в Visual Studio 2012, я попытался создать объект Java vm — но функция всегда завершает мое приложение с кодом выхода 1 (функция не возвращает 1: моя программа завершается полностью и отправляет код выхода 1).

#include <iostream>
#include "jni.h"
int main(int argc, char*argv[]){
JNIEnv* env = nullptr;
JavaVM* jvm = nullptr;
JavaVMInitArgs vm_args;
JavaVMOption options[2];
options[0].optionString = "-Djava.class.path=.";
options[1].optionString = "-DXcheck:jni:pedantic";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE; // remove unrecognized options
int ret = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
std::cout << "This code is never reached" << std::endl;
return 0;
}

ОПЕРАЦИОННЫЕ СИСТЕМЫ: Windows 7 (x64)

Составитель: Visual Studio 2012 (проект x86 / Win32)

Java VM: jdk1.7.0_51, i586 (на мой взгляд, все должно быть в порядке, потому что я компилирую для x86 — иначе связь с jvm.lib не будет работать)

Я уже пытался использовать оба: jdk1.7.0_51\jre\bin\client\jvm.dll так же как jdk1.7.0_51\jre\bin\Server\jvm.dll — с тем же результатом (я не совсем уверен, в чем разница).

Есть идеи & предложения будут высоко оценены.

5

Решение

Использование статических ссылок

  1. удалить jvm.dll из каталогов вашего проекта. DLL должна быть загружена из своего исходного местоположения, так как, похоже, задействованы другие библиотеки DLL, найденные по ссылкам.
  2. Установить PATH переменная окружения, чтобы начать с папки JRE jvm.dll, И не используйте "c:\folder with space in name" обозначение (то есть окружает путь с double quotes). Просто используйте set path=c:\folder with space in name;%PATH%, Эта ошибка сделала мои предыдущие попытки бесполезными.

Использование динамического связывания.

  1. удалить jvm.dll из каталогов вашего проекта. DLL должна быть загружена из своего исходного местоположения, так как, похоже, задействованы другие библиотеки DLL, найденные по ссылкам.
  2. Капля jvm.lib из конфигурации вашего проекта
  3. использование LoadLibrary, с полным путем для jvm.dll (экранируйте ‘\’ или используйте ‘/’)
  4. использование GetProcAddress за «JNI_CreateJavaVM«
  5. Убедитесь, что вы используете правильный typedef для указателя функции (используйте JNICALL как соглашение о вызове)

Патчирование вашего кода с помощью вышеуказанных шагов заставляет мой проект VS2012 / Seven64 / x86Debug / JDK1.6 вывести «Этот код никогда не достигается» (с ret == JNI_OK)

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]