Eclipse: "make: *** Нет правила, чтобы сделать цель" all ". Стоп." - PullRequest
0 голосов
/ 09 мая 2019

Я использую этот учебник для JNI в Eclipse:

https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.6

(я использую только часть " 2.6 JNI в Eclipse ").

И до этой части урока:

Запустите make-файл для цели "all", щелкнув правой кнопкой мыши на make-файле ⇒ Make> Targets ⇒ Build ⇒ Выберите цель "all" ⇒ Build

Казалось, что все работало хорошо (имеется в виду - результаты были такими же, как в учебнике, и на вкладке «Проблемы» не было предупреждений или ошибок).

Но когда я сделал эту часть, я заметил, что строка:

javah -classpath ../bin HelloJNI

отсутствовал при печати в консоли.

Затем я перешел к следующему шагу учебника - « Шаг 5: Запустите программу Java JNI ».

Но несмотря на то, что он выводил на консоль «Hello World!», Я заметил, что во вкладке «Проблемы» есть ошибка:

"make: *** Нет правила, чтобы сделать цель" all ". Стоп."

Среда разработки

+ Eclipse IDE для разработчиков Java (32-разрядная версия) Версия: Kepler Service Release 2.

+ CDT плагин для Eclipse

+ Windows 10 64-разрядная (я использую 32-разрядное затмение, потому что в какой-то момент 64-разрядное затмение не могло открыться, и решение состояло в том, чтобы использовать 32-разрядное затмение)

Makefile

# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : hello.dll

# $@ matches the target, $< matches the first dependency
hello.dll : HelloJNI.o
    gcc -Wl,--add-stdcall-alias -shared -o $@ $<

# $@ matches the target, $< matches the first dependency
HelloJNI.o : HelloJNI.c HelloJNI.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
HelloJNI.h : HelloJNI.class
    javah -classpath $(CLASS_PATH) $*

clean :
    rm HelloJNI.h HelloJNI.o hello.dll

HelloJNI.c

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

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

HelloJNI.java

public class HelloJNI {
   static {
      System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
   }

   // Declare native method
   private native void sayHello();

   // Test Driver
   public static void main(String[] args) {
      new HelloJNI().sayHello();  // Allocate an instance and invoke the native method
   }
}

1 Ответ

1 голос
/ 09 мая 2019

предложить:

Перед целевым файлом makefile all вставить оператор:

.PHONY: all

, поэтому утилита make не пытается создать файл с именем 'all'

Вероятно, следует добавить аналогичное утверждение до цели clean

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...