JNI - "Impossible d'ouvrir le fichier include: 'jni md.h'"

Cet exemple de programme est destiné à appeler un native méthode écrite en C.

Code Java

class HelloWorld {

    private native void print();

    public static void main( String args[] ) {
        new HelloWorld().print();
    }

    static {
        System.loadLibrary("HelloWorld");
    }

}

après avoir écrit ceci j'ai compilé le programme et généré un JNI fichier d'en-tête de style.

Le fichier d'en-tête généré est :

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <C:Program FilesJavajdk1.7.0includejni.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

et la méthode native écrite en c

#include <C:Program FilesJavajdk1.7.0includejni.h>
#include <C:Program FilesJavajdk1.7.0includewin32jni_md.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_print( JNIENv *env , jobject obj) {
    printf("Hello World!n");
    return;
}

l'erreur que j'obtiens lors de la compilation est fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory

mon compilateur souligne jobject obj en disant que this class does not have storage class or specifier . Il souligne *env en disant expected a ')'.

pourquoi j'obtiens cette erreur ?

31
demandé sur user2864740 2011-08-27 10:51:47

4 réponses

je soupçonne que jni.h essaie #include <jni_md.h>, qui échoue alors parce que vous n'avez pas ajouté son emplacement à votre chemin d'inclusion.

essayez d'ajouter ces deux entrées au chemin include de votre compilateur C:

  • C:\Program Files\Java\jdk1.7.0\include
  • C:\Program Files\Java\jdk1.7.0\include\win32

win32 path pourrait ne pas être nécessaire, en fonction de la façon dont jni.h est mis en place.

36
répondu Stuart Cook 2014-08-28 23:21:29

Essayez ceci,

HelloWorld.c

#include "HelloWorld.h"
#include <stdio.h>

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

compiler en utilisant cl.exe (j'utilise VC++ et CL.EXE requis en suivant les commutateurs de ligne de commande.)

c:\ > cl-C / I"c:\Program fichiers\java\jdk1.7.Y compris "/ I"c:\Prog ram Files\java\jdk1.7.0 \ include \ win32 " HelloWorld.c

Lien .module obj

c:\ > link / libpath="c:\Program fichiers\java\jdk1.7.0 \ lib" HelloWorld.obj / dll

0
répondu adatapost 2011-08-27 10:26:30

j'ai eu ce problème une fois, ma solution était en fait d'éditer le jni.h interne #include from "jni_md.h""win32/jni_md.h", bien qu'il y ait probablement une façon moins macabre de le faire.

0
répondu Zannith 2017-07-07 18:29:33

il suffit de copier jni_md.h fichier dans le dossier où jni.h.

-2
répondu phnmnn 2015-09-03 19:53:36