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 ?
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.
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
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.
il suffit de copier jni_md.h fichier dans le dossier où jni.h.