JNI: vcvars32.bat дает мне «Невозможно открыть включаемый файл: 'stdio.h': нет такого файла или каталога»

Я пытаюсь использовать JNI для интеграции кода .C с моим проектом Java.

При попытке сгенерировать файл .dll с помощью vcvars32.bat в Visual Studio 2017 он дает мне сообщение об ошибке:

«C: \ Program Files \ Java \ jdk1.8.0_151 \ include \ jni.h (39): фатальная ошибка C1083: не удается открыть включаемый файл: 'stdio.h': нет такого файла или каталога»

Я удалил включение библиотеки stdio.h в свой код на C, но это не помогло.

Моя команда:

"cl -I" C: \ Program Files \ Java \ jdk1.8.0_151 \ include "-I" C: \ Program Files \ Java \ jdk1.8.0_151 \ include \ win32 "-LD" Factorial.c "-Fe" Factorial.dll ""

Вы уверены, что ваш jvm 32-битный? В 2018 это звучит странно, т.е. в большинстве случаев нужен vcvars64.bat

Victor Gubin 04.04.2018 14:34

Я пробовал vcvars64.bat, vcvarsall.bat и даже VsDevCmd.bat, но, к сожалению, это тоже не помогло

Ahmed Salah 04.04.2018 14:36

Хорошо, давайте сделаем простой файл nmake и проверим:

Victor Gubin 04.04.2018 14:37

создайте файл типа link: compile ln /DLL /LTCG /LIBPATH:"C:\Program Files\Java\jdk1.8.0_151\lib" OUT:factorial.dll msvcrt.lib kernel32.lib jvm.lib Factorial.obj compile: cl /c /nologo /GL /Zl Factorial.c /FoFactorial.obj и используйте nmake для его сборки. Инструкции Nmake docs.microsoft.com/en-us/cpp/build/nmake-referenceengr.iupui.edu/~dskim/downloadable/reference_Nmake.pdf

Victor Gubin 04.04.2018 14:58
Я удалил включение библиотеки stdio.h в свой код на C, но это не помогло. Вы не сможете скомпилировать 32- или 64-разрядную версию без стандартных заголовков C. Вероятно, что-то не так с вашей установкой Visual Studio. Каков полный путь к файлу vcvars32.bat, который вы использовали для настройки своей среды? Вы можете попробовать другой? Сможете составить простой "Hello World!" Программа C в графическом интерфейсе Visual Studio, в которой есть #include <stdio.h>?
Andrew Henle 04.04.2018 17:08

@AndrewHenle, полный путь - "C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ VC \ A вспомогательный \ Build", есть vcvars, vcvars32, vcvars64, vcvarsall, vcvarsamd64_arm, vcvarsamd64_x86, vcvars_arm86_amd64 и vcvars_arm86_amd64 и vcvars_arm86_amd64 из них работает, да, я могу создать WindowsDesktopWizard и запустить проект C

Ahmed Salah 05.04.2018 13:19

IIRC, с VS2107 вам нужно использовать пакет под названием (something)devenv.bat, чтобы получить правильную среду

user2543253 05.04.2018 16:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
485
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После некоторого времени поиска и сбоя мне пришлось сгенерировать его с помощью VS13 vsvars32.bat, обратите внимание, что vsvars, а не vcvars VS17, которые сгенерировали 32-разрядную dll, и поскольку моя платформа 64-разрядная, мне пришлось установить и переключиться на 32-разрядную JVM, и проблема в решено.

Я мог бы сделать это и с VS15.

Ahmed Salah 09.04.2018 23:05

Другие вопросы по теме