Справочная информация для вопроса
Когда я изучал CS в университете, нам пришлось создать проект CBIR с C (и мы получили файл C ++, который выполняет всю «тяжелую работу» по обработке изображений).
Сейчас я пытаюсь создать этот проект на Java.
Я не знал, как реализовать в Java некоторые вещи из этого файла C ++, поэтому я решил использовать JNI и вызвать этот файл из моей программы Java.
Я использую это руководство для JNI: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.6
Среда разработки
+ Eclipse IDE для разработчиков Java (32-разрядная версия), версия: 2018-09 (4.9.0.было использовать 32-битное затмение)
Проблема
Когда я делаю эту часть учебника:
Щелкните правой кнопкой мыши на «makefile» ⇒ MakeЦели ⇒ Создать ⇒ В поле «Имя цели»> ввести «все».Повторите для создания цели «clean».
Запустите make-файл для цели «all», щелкнув правой кнопкой мыши на make-файле ⇒ Make> Targets ⇒ Build ⇒ Выберите цель «all» ⇒ Build
Кажется, что он работает хорошо.
Но когда я запускаю программу (как было рекомендовано в "Шаг 5: Запустите программу JNI на Java"), хотя программа выводит на консоль, чтоЯ хотел, чтобы после его запуска Eclipse показал мне:
Unresolved inclusion: <jni.h>
как в файле c ++, так и в файле заголовка.
И я проверил, и у меня есть файл jni.h в пути, который я написал в make-файле ("C: \ Program Files (x86) \ Java \ jdk1.8.0_212 \ include").
Кроме того, я хотел бы знать, как выполнить компиляцию после следующих изменений в файлах cpp / h.
Редактировать:
Теперь я заметил, что перед запуском программы существуетa Предупреждение на вкладке «Проблемы»:
Недопустимый путь к проекту: Включить путь не найден (Program Files> (x86) \ Java \ jdk1.8.0_212 \ include).
Но я не понимаю, почему он пишется как «Program Files» вместо «C \ Program Files».
Edit2:
Я создал новый проект в надежде, что онрешит проблему.Когда я «собрал» для цели «все», я получил ошибку:
make: *** No rule to make target `all'. Stop.
Я увидел, что кто-то предложил проверить «Автоматически генерировать Makefile» (В Свойствах проекта -> Сборка C / C ++)но когда я это сделал, я увидел на консоли «ничего не построить для проекта CBIR2»
Так что я снова «собрал» для цели «все» и каким-то «волшебным» образом эта ошибка исчезла.
Тогда казалось, что запуск в порядке (хотя время выполнения очень большое), но когда я проверил вкладку «Проблемы», я снова увидел ошибку:
make: *** No rule to make target `all'. Stop.
Поэтому я снова «собрал» для цели «все», и эта ошибка исчезла.
Но, очевидно, что-то здесь не так, если я получаю эту ошибку при каждом запуске программы, а также до первого запуска программы.
makefile
# Define a variable for classpath
CLASS_PATH = ../bin
# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)
all : SPImageProc.dll
# $@ matches the target, $< matches the first dependency
SPImageProc.dll : SPImageProc.o
gcc -Wl,--add-stdcall-alias -shared -o $@ $<
# $@ matches the target, $< matches the first dependency
SPImageProc.o : SPImageProc.cpp SPImageProc.h
gcc -I"C:\Program Files (x86)\Java\jdk1.8.0_212\include" -I"C:\Program Files (x86)\Java\jdk1.8.0_212\include\win32" -c $< -o $@
# $* matches the target filename without the extension
SPImageProc.h : SPImageProc.class
javah -classpath $(CLASS_PATH) $*
clean :
rm SPImageProc.h SPImageProc.o SPImageProc.dll
SPImageProc.cpp
#include <jni.h>
#include <stdio.h>
#include "SPImageProc.h"
JNIEXPORT void JNICALL Java_SPImageProc_saySPImageProc(JNIEnv *env, jobject thisObj) {
printf("SPImageProc 333!\n");
return;
}
SPImageProc.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SPImageProc */
#ifndef _Included_SPImageProc
#define _Included_SPImageProc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SPImageProc
* Method: saySPImageProc
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_SPImageProc_saySPImageProc
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
CBIR.java
public class CBIR {
public static void main(String[] args) {
SPImageProc.example();
}
}
SPImageProc.java
public class SPImageProc {
static {
System.loadLibrary("SPImageProc"); // SPImageProc.dll
}
// Declare native method
private native void saySPImageProc();
public static void example() {
// Allocate an instance and invoke the native method
new SPImageProc().saySPImageProc();
}
}