Java의 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 빠른 입문 강좌(추천)는 바로 여러분이 공유하는 모든 내용입니다. 참고 부탁드리며 많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.