Java의 JNI 빠른 시작 자습서(권장)

3575 단어 JavaJNI
1. JNI 소개
JNI는 Java Native Interface의 영문 줄임말로 Java 로컬 인터페이스를 의미합니다.
문제 출처: 자바 컴파일의 밑바닥 응용은 실현하기 어렵고 일부 실시간 요구가 매우 높은 부분에서 자바는 감당하기 어렵다(실시간 요구가 높은 부분은 아직 언급되지 않았기 때문에 실시간 이런 화제는 검토해야 한다).
해결 방법: 자바는 JNI를 사용하여 기존의 로컬 라이브러리(C/C++로 시스템과 관련된 프로그램과 라이브러리를 개발할 수 있음)를 호출하여 자바의 개발을 크게 유연하게 할 수 있다.
2. JNI 빠른 학습 강좌
2.1 질문:
JNI를 사용하여 코드를 작성하여string_Java_Test_helloworld(JNIENv*env, jclasscls, jstring j_str) 함수, 문자열 j_str ("world") 앞에hello를 붙이고 돌아갑니다.
2.2 문제 해결 프로세스:
I. 작성 테스트.java 클래스:

public class Test{
  // native interface
  public native String helloworld(String text);
  
  public static void main(String[] args){
    // Load dynamic library
    System.loadLibrary("Test2");
    Test ts = new Test();
    String text = ts.helloworld("world");
    System.out.println(text);
  }
}
참고:
1. 동적 라이브러리 불러오기: 시스템.loadLibrary("Test2");[Windows에서 로드된 것은 Test2.dll이고 Linux에서 로드된 것은 Test2.so입니다.]
II. 컴파일 테스트.java 파일
cmd 입력 명령 > javac Test에 들어갑니다.java
III. 생성 테스트.h 파일
cmd 입력 명령 진입 > javah Test
Test.h 파일의 내용은 다음과 같습니다.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   Test
 * Method:  helloworld
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Test_helloworld
 (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif
참고:
1. 함수 선언, 고정 형식: JNIEXPORT;반환 형식: jstring;JNI 호출: JNICALL;Java_전체 클래스 이름_방법명: Java_Test_helloworld;
2. 함수 매개 변수: jni를 호출합니다.h 봉인된 함수 바늘: JNIENv;Java 클래스 자체:jobject, Java 파일 전송 매개 변수:jstring.
IV. C 언어 파일 작성 Test2.c Test 클래스에서 동적 링크 라이브러리를 호출하는 기능:

#include "Test.h"
#include <string.h>

JNIEXPORT jstring JNICALL Java_Test_helloworld
 (JNIEnv *env, jobject obj, jstring string){
  const char* str = (*env)->GetStringUTFChars(env,string,0);
  char cap[128];
  cap[0] = 'h';
  cap[1] = 'e';
  cap[2] = 'l';
  cap[3] = 'l';
  cap[4] = 'o';
   
  strcat(cap,str);
   
  (*env)->ReleaseStringUTFChars(env,string,0);
  return (*env)->NewStringUTF(env,cap);
 }
참고:
1. 자바 자체가 2바이트 문자를 사용하고 C 언어 자체가 단바이트 문자이기 때문에 (*env)->GetStringUTFchars()를 사용하여 자바와 C 사이의 문자열을 변환해야 한다.
2. GetStringUTFCHars()와 NewStringUTF()는 첫 번째는 UTF8에서 C로 인코딩 형식을 바꾸고 두 번째는 C의 문자열에 따라 UTF8 문자열을 되돌려줍니다.
3. Release String UTFchars () 는 개체를 방출하는 데 사용되며 Java에 있는 가상 머신이 쓰레기 수거를 하지만 C 언어에서 이 개체는 수동으로 회수해야 합니다. 그렇지 않으면 메모리 유출이 발생할 수 있습니다.
V. 컴파일 및 실행
컴파일:
cmd 입력 명령 진입 > gcc -I "D:\Program Files\Java\jdk1.8.0_45\include"-I "D:\Program Files\Java\jdk1.8.0_45\include\win32"--share Test2.c -o Test2.dll
실행:
cmd 입력 명령 진입 > java Test
실행 결과는 다음과 같습니다.
helloworld
3. 요약:
첫 번째 단계:native 방법이 있는 자바 클래스(Test.java)를 작성하고,javac 도구를 사용하여 자바 클래스(Test.class 생성)를 컴파일합니다.
두 번째 단계:javah를 사용하여native 방법에 대응하는 헤더 파일 생성(Test.h);
3단계: C/C++를 사용하여 적절한 헤더 파일(Test2.c)을 구현하고 동적 링크 라이브러리(Test2.so)로 컴파일합니다.
본고의 운영 환경: Windows 64비트 운영체제, JDK 1.8 버전,mingw64(GCC).
이상의 Java의 JNI 빠른 입문 강좌(추천)는 바로 여러분이 공유하는 모든 내용입니다. 참고 부탁드리며 많은 응원 부탁드립니다.

좋은 웹페이지 즐겨찾기