JDK9 NetBeans Dev - ошибка компиляции во время учебника JNI

Я тщательно обыскивал всю сеть почти два дня и не мог найти решения моей проблемы. Я надеюсь, что вы, ребята, можете мне помочь. Это может быть немного специфично, но я уверен, что рано или поздно другие столкнутся с такими же проблемами.

В настоящее время я использую NetBeans Dev (сборка 201803200002) с Java JDK 9.0.4 в 64-разрядной системе Windows 10.

Я работал с этим учебником JNI: https://cnd.netbeans.org/docs/jni/beginning-jni-win.html

Почти в конце, ниже рисунка 13, вы должны собрать проект HelloWorldNative (в моем случае он называется JNITestNative).

Но я всегда получаю следующее сообщение об ошибке:

cd 'D:\NetBeans\projects\JNITestNative'
C:\Programme\cygwin\bin\make.exe -f Makefile CONF=Debug
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/d/NetBeans/projects/JNITestNative'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/JNITestNative.dll
make[2]: Entering directory '/cygdrive/d/NetBeans/projects/JNITestNative'
mkdir -p build/Debug/Cygwin-Windows
rm -f "build/Debug/Cygwin-Windows/JNITest.o.d"
gcc -mno-cygwin -Wl,--add-stdcall-alias shared -m32   -c -g -I/cygdrive/C/Program\ Files/Java/jdk-9.0.4/include -I/cygdrive/C/Program\ Files/Java/jdk-9.0.4/include/win32  -MMD -MP -MF "build/Debug/Cygwin-Windows/JNITest.o.d" -o build/Debug/Cygwin-Windows/JNITest.o JNITest.c
gcc: error: shared: No such file or directory
gcc: error: unrecognized command line option '-mno-cygwin'; did you mean '-mno-clwb'?
nbproject/Makefile-Debug.mk:66: recipe for target 'build/Debug/Cygwin-Windows/JNITest.o' failed
make[2]: *** [build/Debug/Cygwin-Windows/JNITest.o] Error 1
make[2]: Leaving directory '/cygdrive/d/NetBeans/projects/JNITestNative'
nbproject/Makefile-Debug.mk:59: recipe for target '.build-conf' failed
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory '/cygdrive/d/NetBeans/projects/JNITestNative'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 1s)

NetBeans, похоже, не хватает файла, который я ожидаю сгенерировать в первую очередь - JNITest.o

Я проверил каталоги ... jdk-9.0.4 / include, ... jdk9.0.4 / include / win32 и ... Debug / Cygwin-Windows. Все они существуют, но файлы JNITest.o.d или JNITest.o отсутствуют.

Я попытался заменить «cygwin» на «clwb», как было предложено во втором сообщении об ошибке, но первая ошибка все еще возникает.

Согласно некоторым источникам в Интернете, я также удалил целую часть «-mno-cygwin» из дополнительных параметров, но первая ошибка все еще возникает.

Согласно некоторым другим источникам в Интернете, я добавил свой каталог ... cygwin / bin в каталоги include, но это ничего не улучшило.

Я совершенно не знаю, как решить эту проблему или как искать другие возможные решения.

Надеюсь, здесь кто-нибудь может помочь.

Вам не хватает - перед shared, поэтому gcc считает, что это входной файл, а не вариант -shared (из учебника), закрываясь как опечатка.

Jorn Vernee 06.04.2018 15:14

Большое спасибо. Это исправило первую ошибку. Однако сборка все еще не удалась. Должен ли я открыть новый вопрос или отредактировать свое первоначальное сообщение?

el platin 09.04.2018 08:58

Я полагаю, это зависит от вас. Если проблема достаточно похожа, я бы сказал, что вы можете редактировать, но правильнее всего будет опубликовать новый вопрос. Посмотрев на это еще раз, вы также должны сбросить флаг -m32, поскольку он предназначен для 32-битных сборок, но похоже, что у вас 64-битная виртуальная машина.

Jorn Vernee 09.04.2018 10:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
125
1

Ответы 1

Правильный ответ дал Йорн Верни в своем комментарии. Перед аргументом «общий» отсутствовал знак «-». Спасибо тебе за это.

Для всех, кто может столкнуться с этой проблемой, позвольте мне подвести итог, как я пришел к успешной сборке.

Согласно это и это я добавил три строки кода для определения типа данных __int64, поэтому теперь мой JNITest.c выглядит так:

#ifdef __CYGWIN__
#define __int64 long long
#endif

#include <jni.h>
#include <stdio.h>
#include "JNITest.h"

JNIEXPORT void JNICALL Java_com_plaettner_jnitest_JNITest_nativePrint
    (JNIEnv *env, jobject obj)
{
    printf("\nHello World from C\n");
}

Затем я добавил пакеты «mingw64-i686-gcc-core: GCC для Win32» и «mingw64-i686-gcc-g ++: GCC для Win32» в свой Cygwin.

В параметрах NetBeans - C / C++ - Build Tools я затем изменил компилятор C и C++ с gcc / g ++ на i686-w64-mingw32-gcc / g ++ соответственно.

В свойствах проекта в категориях Build - C Compiler / C++ Compiler я изменил дополнительные параметры с «-mno-cygwin -Wl, - add-stdcall-alias -shared -m32» на «-Wl, - add-stdcall. -alias -shared "и добавил мой ... cygwin / bin каталог в подключаемые каталоги.

Это уже приводит к успешной сборке. В любом случае я снова добавил «-m32» к дополнительным параметрам и изменил компилятор c / C++ обратно на gcc / g ++, чтобы сохранить соответствие руководству. Теперь это тоже приводит к успешной сборке, хотя раньше этого не было.

Удаление каталога ... cygwin / bin из подключаемых каталогов снова приводит к неудачной сборке, и весь процесс необходимо повторить. По крайней мере, для меня это сработало.

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