JNI - "'jni_md' 포함 파일을 열 수 없습니다.h'"
이 샘플 프로그램은 A를 호출하기 위한 것입니다.native
C로 표기하는 방법.
자바 코드
class HelloWorld {
private native void print();
public static void main( String args[] ) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
이 글을 쓴 후에 나는 프로그램을 컴파일하고 생성했습니다.JNI
style 헤더 파일.
생성된 헤더 파일은 다음과 같습니다.
/* 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
'programing' 카테고리의 다른 글
C#에서 C/inline 어셈블리 사용 (0) | 2023.10.22 |
---|---|
PowerShell에서 설정(데이터 구조) (0) | 2023.10.22 |
파워셸 다차원 배열 (0) | 2023.10.17 |
Sequelize로 MariaDB에 값 'null'을 삽입하는 방법? (0) | 2023.10.17 |
CSS 두 디브가 서로 옆에 있음 (0) | 2023.10.17 |