2014-01-29 2 views
4

Я пытаюсь вызвать метод 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).JNI_CreateJavaVM() завершается с кодом завершения 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; 
} 

OS: Windows 7 (x64)

Компилятор: Visual Studio 2012 (x86/Win32 Project)

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 - с тем же результатом (я не совсем уверен, какая разница, хотя).

Любые идеи & Предложения были бы высоко оценены.

+0

Помог ли мой ответ? – manuell

ответ

6

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

  1. удалить jvm.dll из ваших каталогов проекта. DLL должна быть загружена из исходного местоположения, так как кажется, что другие DLL участвуют, найденные по ссылкам.
  2. Установите переменную environement 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 в качестве вызывающей конвенции)

Patching кода с предыдущими этапами делает мои VS2012 Seven64/x86Debug/JDK1.6 проект/к выходу «Этот код никогда не достигается» (с ret == JNI_OK)

+0

Спасибо, что работает так. Моя проблема скорее всего скопировала dll в каталог проекта. Вместо того, чтобы копировать параметр PATH в 'jdk1.7.0_51 \ jre \ bin \ client', он решил (даже с использованием .lib &.h файлов - без 'LoadLibrary/GetProcAddress'). – Constantin

+0

Спасибо вам за комментарий. Я снова попробовал. Будет обновляться. – manuell