Я использую этот учебник для 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
}
}