JNI - "Не могу открыть файл include:" jni_md.h "
Эта примерная программа предназначена для вызова метода native
, написанного на C.
Код Java
class HelloWorld {
private native void print();
public static void main( String args[] ) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
После написания этого я скомпилировал программу и сгенерировал заголовочный файл стиля JNI
.
Созданный файл заголовка:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <C:\Program Files\Java\jdk1.7.0\include\jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
И собственный метод, написанный в c
#include <C:\Program Files\Java\jdk1.7.0\include\jni.h>
#include <C:\Program Files\Java\jdk1.7.0\include\win32\jni_md.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print( JNIENv *env , jobject obj) {
printf("Hello World!\n");
return;
}
Ошибка при компиляции - fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory
Также мой компилятор подчеркивает jobject obj
, говоря, что this class does not have storage class or specifier
. Он подчеркивает *env
, говоря expected a ')'
.
Почему я получаю эту ошибку?
Ответы
Ответ 1
Я подозреваю, что jni.h
пытается #include <jni_md.h>
, который затем терпит неудачу, потому что вы не добавили его местоположение в свой путь include.
Попробуйте добавить обе эти записи в свой компилятор C, включая путь:
-
C:\Program Files\Java\jdk1.7.0\include
-
C:\Program Files\Java\jdk1.7.0\include\win32
Возможно, путь win32
не требуется, в зависимости от того, как настроен jni.h
.
Ответ 2
Попробуйте это,
helloworld.c
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
Скомпилируйте его с помощью cl.exe(я использую VС++ и CL.EXE, необходимые для следующих параметров командной строки.)
c: \ > cl -c/I "c:\Program Files\java\jdk1.7.0\include" /I "c:\Prog ram Файлы \java\jdk1.7.0\include\win32" HelloWorld.c
Ссылка .obj module
c: \ > link/libpath = "c:\Program Files\java\jdk1.7.0\lib" HelloWorld.obj/dll
Ответ 3
У меня была эта проблема один раз, мое решение было фактически отредактировать jni.h internal #include от "jni_md.h"
до "win32/jni_md.h"
, хотя, вероятно, существует менее хакерский способ, которым вы должны это делать.
Ответ 4
Вы должны сначала включить следующий файл заголовка в ваш нативный код
#include <jni.h>
В моем случае в системе UNIX,
-
Этот заголовочный файл jni.h
присутствует в /usr/lib/jvm/java-8-openjdk-amd64/include/
-
Кроме того, jni_md.h
присутствует в /usr/lib/jvm/java-8-openjdk-amd64/include/linux
Вы можете получить путь к установке Java в вашей системе с помощью следующей команды
whereis java
/usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
ls -l /usr/bin/java
/usr/bin/java -> /etc/alternatives/java
ls -l /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
где (->) - символическая ссылка.
Наконец, вы получите путь установки Java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Также не забудьте jni.h
jni_md.h
файлам jni.h
& jni_md.h
при выполнении их собственной компиляции.
Компиляция: -
gcc -I /usr/lib/jvm/java-8-openjdk-amd64/include/ -I /usr/lib/jvm/java-8-openjdk-amd64/include/linux/ -o libHelloWorld.so -shared *nativeSourceCodeFile*.c
где (-I) обозначает путь.
Исполнение: -
java -Djava.library.path=. HelloWorld
Следующий,
JNIEXPORT void JNICALL Java_HelloWorld_print( JNIEnv* env , jobject obj){
printf("Hello World!\n");
}
Просто посмотрите на сделанные небольшие изменения и попробуйте реализовать их.
Ответ 5
Просто скопируйте файл jni_md.h в папку, где jni.h.