JNI - "无法打开包含文件:'jni_md.h'"

Suh*_*pta 36 c java java-native-interface compiler-errors

此示例程序旨在调用native用C编写的方法.

Java代码

class HelloWorld {

    private native void print();

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

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

}
Run Code Online (Sandbox Code Playgroud)

写完这个后,我编译了程序并生成了一个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
Run Code Online (Sandbox Code Playgroud)

用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;
}
Run Code Online (Sandbox Code Playgroud)

我编译的错误是 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.它强调*envexpected a ')'.

为什么我会收到此错误?

Stu*_*ook 40

我怀疑jni.h是在尝试#include <jni_md.h>,然后失败,因为你还没有将它的位置添加到你的包含路径.

尝试将这两个条目添加到C编译器的包含路径中:

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

win32路径可能是不必要的,这取决于如何jni.h设置.

  • 我在linux上遇到过这个问题.`jni_md.h`文件在我的java`include/linux`文件夹中,我不得不手动创建一个包含/文件夹的链接(快捷方式)来解决这个问题.在Windows上,您可以尝试将快捷方式文件添加到该文件. (4认同)
  • 在 Mac OSX 上有同样的问题。文件路径为 /Library/Java/JavaVirtualMachines/jdk&lt;version&gt;.jdk/Contents/Home/include/darwin/jni_md.h (4认同)