Я пытаюсь вызвать метод 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
— с тем же результатом (я не совсем уверен, в чем разница).
Есть идеи & предложения будут высоко оценены.
Использование статических ссылок
jvm.dll
из каталогов вашего проекта. DLL должна быть загружена из своего исходного местоположения, так как, похоже, задействованы другие библиотеки DLL, найденные по ссылкам.PATH
переменная окружения, чтобы начать с папки JRE jvm.dll
, И не используйте "c:\folder with space in name"
обозначение (то есть окружает путь с double quotes
). Просто используйте set path=c:\folder with space in name;%PATH%
, Эта ошибка сделала мои предыдущие попытки бесполезными.Использование динамического связывания.
jvm.dll
из каталогов вашего проекта. DLL должна быть загружена из своего исходного местоположения, так как, похоже, задействованы другие библиотеки DLL, найденные по ссылкам.jvm.lib
из конфигурации вашего проектаLoadLibrary
, с полным путем для jvm.dll (экранируйте ‘\’ или используйте ‘/’)GetProcAddress
за «JNI_CreateJavaVM
«typedef
для указателя функции (используйте JNICALL
как соглашение о вызове)Патчирование вашего кода с помощью вышеуказанных шагов заставляет мой проект VS2012 / Seven64 / x86Debug / JDK1.6 вывести «Этот код никогда не достигается» (с ret == JNI_OK
)
Других решений пока нет …