programing

JNI - "'jni_md' 포함 파일을 열 수 없습니다.h'"

yellowcard 2023. 10. 17. 20:11
반응형

JNI - "'jni_md' 포함 파일을 열 수 없습니다.h'"

이 샘플 프로그램은 A를 호출하기 위한 것입니다.nativeC로 표기하는 방법.

자바 코드

class HelloWorld {

    private native void print();

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

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

}

이 글을 쓴 후에 나는 프로그램을 컴파일하고 생성했습니다.JNIstyle 헤더 파일.

생성된 헤더 파일은 다음과 같습니다.

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

그리고 native method는 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;
}

컴파일할 때 발생하는 오류는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. 밑줄을 그립니다.*env고 말하는 것expected a ')'.

이 오류가 발생하는 이유는 무엇입니까?

제가 보기엔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가 설정되어 있습니다.

이거 먹어봐요.

헬로월드

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

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

cl.exe를 사용하여 컴파일합니다 (VC++와 CL을 사용하고 있습니다).명령줄 스위치 다음에 EXE가 필요합니다.)

c:\>cl -c /I"c:\Program Files\java\jdk1.7.0\include" /I"c:\Program Files\jdk1.7.0\include\win32" HelloWorld.c

링크 .obj 모듈

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

자바에서의 단순 자바 네이티브 인터페이스(JNI) 예

  • env:jdk8 、macOS 10.15
// Main.java
public class Main {
    public native int intMethod(int i);
    static {
        System.loadLibrary("Main");
    }
    public static void main(String[] args) {
        System.out.println(new Main().intMethod(2));
    }
}
// Main.c:
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i)
{
    return i * i;
}

컴파일 및 실행:

javac Main.java -h .
gcc -dynamiclib -O3 \
    -I/usr/include \
    -I$JAVA_HOME/include \
    -I$JAVA_HOME/include/darwin \
    Main.c -o libMain.dylib
java -cp . -Djava.library.path=$(pwd) Main

출력:

4

제가 이 문제가 있었던 적이 있는데, 사실 제 해결책은 jni를 편집하는 것이었습니다.h의 내부 # include."jni_md.h"로."win32/jni_md.h", 당신이 할 수 있는 방법이 아마 더 적을 것입니다.

먼저 네이티브 코드에 다음 헤더 파일을 포함해야 합니다.

#include <jni.h>

UNIX 시스템에 있는 제 경우에는

  • 이 헤더파일jni.h에 있습니다./usr/lib/jvm/java-8-openjdk-amd64/include/

  • 또한.jni_md.h에 있습니다./usr/lib/jvm/java-8-openjdk-amd64/include/linux

Java 설치 경로가 시스템에서 리디렉션되는 위치를 알고 있으면 위의 파일로 이동할 수 있습니다.명령어 집합을 따라 수행합니다.

whereis java
/usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz

ls -l /usr/bin/java
/usr/bin/java -> /etc/alternatives/java

ls -l /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

여기서 (->)는 심볼릭 링크입니다.

  • 드디어 자바 설치 경로가 나옵니다.저 같은 경우는./usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

또한 다음을 포함하는 것을 잊지 마십시오.jni.h&jni_md.h기본 컴파일을 수행하는 동안 파일 경로를 지정합니다.

컴필레이션:-

gcc -I /usr/lib/jvm/java-8-openjdk-amd64/include/ -I /usr/lib/jvm/java-8-openjdk-amd64/include/linux/ -o libHelloWorld.so -shared *nativeSourceCodeFile*.c

여기서 (-I)는 경로 식별입니다.

  • 위 명령어는 우리의 네이티브 코드를 컴파일하며, 이것이 자바 네이티브 인터페이스 헤더 파일의 경로인 이유입니다.jni.h참조로 제공합니다.
  • jni.h다음을 명시적으로 가져옵니다.jni_md.h#include "jni_md.h"& 그렇기 때문에 우리는 그것에 대한 우리의 편집에서 다음 언급을 한 것입니다.jni_md.h파일.
  • jni_md.h에는 jbyte, jint 및 jlong에 대한 시스템 종속 유형이 포함되어 있습니다.

실행:-

java -Djava.library.path=. HelloWorld

다음 분.

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

약간의 변화만 보고 구현을 시도해 보십시오.

언급URL : https://stackoverflow.com/questions/7212982/jni-cannot-open-include-file-jni-md-h

반응형