2011-08-27 27 views
28

chương trình mẫu này có nghĩa là để gọi một phương thức native viết bằng C.JNI - "Không thể mở bao gồm file: 'jni_md.h"

Java Mã

class HelloWorld { 

    private native void print(); 

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

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

} 

Sau khi viết i này đã biên soạn chương trình và tạo ra một tệp tiêu đề kiểu JNI.

File header được tạo ra là:

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

Và phương pháp có nguồn gốc viết bằng 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; 
} 

Các lỗi tôi nhận được vào biên dịch là fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory

Ngoài ra trình biên dịch của tôi gạch dưới jobject obj nói rằng this class does not have storage class or specifier. Nó gạch chân *env nói expected a ')'.

Tại sao tôi gặp lỗi này?

+1

Bạn không có tệp hoặc thư mục nào như vậy. Kiểm tra? – dcousens

+1

@ Daniel Nó ở đó. Câu lệnh 'include' không đưa ra lỗi –

+0

Bạn có , nhưng không phải là" jni_md.h ". Kiểm tra các tiêu đề bao gồm những gì; cụ thể hơn, tiêu đề bao gồm "jni_md.h". EDIT: Xem Stuart Cooks câu trả lời. – dcousens

Trả lời

33

Tôi nghi ngờ rằng jni.h đang cố gắng #include <jni_md.h>, sau đó không thành công vì bạn chưa thêm vị trí của nó vào đường dẫn bao gồm của bạn.

Hãy thử thêm cả hai mục để trình biên dịch C của bạn bao gồm đường dẫn:

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

Đường dẫn win32 có thể không cần thiết, tùy thuộc vào cách jni.h được thiết lập.

+0

Tôi đã thêm 'C: \ Program Files \ Java \ jdk1.7.0 \ include' vào thư mục bao gồm dự án của tôi và sau đó tôi cũng gặp lỗi tương tự –

+0

Bạn đã thêm cả hai dòng? Kiểm tra trong 'jni.h' để xem nó bao gồm' jni_md.h' như thế nào. –

+0

Tôi đã thử một trong hai cách: thêm 'C: \ Program Files \ Java \ jdk1.7.0 \ include \ Win32' và không thêm đường dẫn. Nhưng nó không giải quyết được vấn đề của tôi –

0

Hãy thử điều này,

HelloWorld.c

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

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

Biên dịch nó bằng cách sử cl.exe (Tôi đang sử dụng VC++ và CL.EXE cần sau công tắc dòng lệnh.)

c: \> cl -c/I "c: \ Program Files \ java \ jdk1.7.0 \ include"/I "c: \ Prog Tệp ram \ java \ jdk1.7.0 \ include \ win32" HelloWorld.c

liên kết mô-đun .obj

c: \> liên kết/LIBPATH = "c: \ Program Files \ java \ jdk1.7.0 \ lib" HelloWorld.obj/dll

+0

Xin lỗi vì offtopic, nhưng tôi có thể tải xuống gói 'cl.exe' ở đâu (tôi chỉ cần dòng lệnh) trình biên dịch, libs + tiêu đề)? Cảm ơn. –

+1

@dma_k Bạn có thể tải xuống Visual C++ 2010 Express (miễn phí) - http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express – adatapost

-2

Chỉ cần sao chép jni_md .h tập tin vào thư mục nơi jni.h.

0

Tôi gặp sự cố này một lần, giải pháp của tôi thực ra là chỉnh sửa jni.Số nội bộ của h trong số từ "jni_md.h" đến "win32/jni_md.h", mặc dù có thể bạn sẽ phải thực hiện một cách ít hacky hơn.

Các vấn đề liên quan