Подтвердить что ты не робот

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 ')'.

Почему я получаю эту ошибку?

4b9b3361

Ответ 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.