2011-08-27 31 views
28

Este programa de ejemplo está destinado a llamar a un método native escrita en C.JNI - "No se puede abrir archivo de inclusión: 'jni_md.h'"

Código de Java

class HelloWorld { 

    private native void print(); 

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

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

} 

Después de escribir esto, compiló el programa y generó un archivo de encabezado de estilo JNI.

El archivo de cabecera generado es:

/* 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 

Y el método nativo escrito en 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; 
} 

El error que consigo en la compilación es fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory

También mi compilador subraya jobject obj diciendo que this class does not have storage class or specifier. Subraya *env diciendo expected a ')'.

¿Por qué me sale este error?

+1

No tiene tal archivo o directorio. ¿Comprobar? – dcousens

+1

@ Daniel Está allí. La instrucción 'include' no da un error –

+0

Tiene , pero no" jni_md.h ". Compruebe qué encabezados incluyen qué; más específicamente, qué encabezado incluye "jni_md.h". EDITAR: Ver la respuesta de Stuart Cooks. – dcousens

Respuesta

33

Sospecho que jni.h está intentando #include <jni_md.h>, que luego está fallando porque no ha agregado su ubicación a su ruta de inclusión.

Trate de añadir estas dos entradas a su compilador de C de ruta de inclusión:

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

El camino win32 podría no ser necesario, dependiendo de cómo jni.h esté configurado.

+0

He añadido 'C: \ Archivos de programa \ Java \ jdk1.7.0 \ include' a los directorios de inclusión de mi proyecto y luego también me sale el mismo error –

+0

¿Agregó ambos? ¿líneas? Comprueba 'jni.h' para ver cómo incluye' jni_md.h'. –

+0

Lo he intentado de cualquier manera: agregando 'C: \ Program Files \ Java \ jdk1.7.0 \ include \ Win32' y no agregando la ruta de acceso. Pero no resuelve mi problema –

0

Prueba de esto,

HelloWorld.c

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

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

compilarlo usando cl.exe (estoy usando VC++ y CL.exe requerido siguientes modificadores de la línea de comandos.)

c: \> cl -c/I "c: \ Archivos de programa \ java \ jdk1.7.0 \ include"/I "c: \ Prog ram Archivos \ java \ jdk1.7.0 \ include \ win32" HelloWorld.c

Enlace módulo .obj

c: \> enlace/libpath = "c: \ Archivos de programa \ Java \ jdk1.7.0 \ lib" HelloWorld.obj/dll

+0

Disculpe las ofensivas, pero ¿dónde puedo descargar el paquete 'cl.exe' (solo necesito la línea de comandos? compilador, libs + encabezados)? Gracias. –

+1

@dma_k Puede descargar Visual C++ 2010 Express (es gratis) - http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express – adatapost

-2

Simplemente copia jni_md .h archivo a la carpeta donde jni.h.

0

Tuve este problema una vez, mi solución fue en realidad editar el jni.h's interno #include de "jni_md.h" a "win32/jni_md.h", aunque es probable que haya una manera menos hacky que se supone que debes hacerlo.

Cuestiones relacionadas