Java의 native 키워드 상세 정보
간단하게 말하면 Native Method는 자바가 아닌 자바 코드를 호출하는 인터페이스이다.하나의 Native Method는 이러한 자바 방법이다. 이 방법의 실현은 비자바 언어로 이루어진다. 예를 들어 C.이 특징은 자바가 가지고 있는 것이 아니다. 많은 다른 프로그래밍 언어에는 이런 메커니즘이 있다. 예를 들어 C+에서 extern'C'로 C++ 컴파일러에게 C의 함수를 호출할 수 있다.
"A native method is a Java method whose implementation is provided by non-java code."
native method를 정의할 때 실현체를 제공하지 않습니다. (일부는 자바 인터페이스를 정의하는 것과 같습니다.) 사실 현체는 비자바 언어가 밖에서 이루어지기 때문입니다.다음은 예제입니다.
package java.lang;
public class Object {
......
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
......
}
식별자native는 모든 다른java 식별자와 연결할 수 있지만 abstract는 제외됩니다.이것은 합리적이다. 왜냐하면native는 이러한 방법이 실현체가 있다는 것을 암시하기 때문이다. 단지 이러한 실현체는 비java일 뿐이지만 abstract는 이러한 방법이 실현체가 없다는 것을 분명히 가리킨다.native가 다른 자바 식별자와 연결될 때 그 의미는 비Native Method와 차이가 없습니다.하나의nativemethod 방법은 비기본 형식을 포함하여 모든 자바 형식을 되돌려 줄 수 있으며, 또한 이상 제어를 할 수 있습니다.이러한 방법의 실현체는 이상을 자제하여 그것을 던질 수 있다는 점은java의 방법과 매우 비슷하다.
native method의 존재는 다른 클래스가 로컬 방법을 호출하는 데 아무런 영향을 미치지 않습니다. 실제로 이 방법을 호출하는 다른 클래스는 로컬 방법을 호출하는 줄도 모릅니다.JVM은 로컬 메서드를 호출하는 모든 세부 사항을 제어합니다.
만약 로컬 방법을 포함하는 클래스가 계승된다면, 하위 클래스는 이 로컬 방법을 계승하고 자바 언어로 이 방법을 다시 쓸 수 있다. (이것은 보기에 좀 이상한 것 같다.) 마찬가지로 로컬 방법이fianl에 표시된다면, 이 방법은 계승된 후에 다시 쓸 수 없다.
로컬 방법은 매우 유용하다. 왜냐하면 이것은 효과적으로 jvm를 확충했기 때문이다.사실상, 우리가 쓴 자바 코드는 이미 로컬 방법을 사용했다. 선의 자바 병발(다중 스레드) 메커니즘 실현에서 많은 운영체제와 접촉점은 로컬 방법을 사용했기 때문에 자바 프로그램은 자바가 실행될 때의 경계를 초월할 수 있다.로컬 방법이 있으면 자바 프로그램은 모든 응용 단계의 작업을 할 수 있다.
2. 사용 방법
native 키워드는 그 수식 방법이 원생태적인 방법이라는 것을 설명한다. 방법에 대응하는 실현은 현재 파일이 아니라 다른 언어(예를 들어 C와 C++)로 이루어진 파일에 있다.Java 언어 자체는 운영체제의 밑바닥에 접근하고 조작할 수 없지만 JNI 인터페이스를 통해 다른 언어를 호출하여 밑바닥에 접근할 수 있다.
JNI는 자바 네이티브 인터페이스(Java Native Interface)로 자바 소프트웨어 개발 도구 상자(Java Software Development Kit, SDK)의 일부분이다.JNI는 Java 코드가 다른 언어로 작성된 코드 및 코드 라이브러리를 사용할 수 있도록 합니다.Invocation API(JNI의 일부)는 JVM(JVM)을 네이티브 응용 프로그램에 삽입하여 프로그래머가 네이티브 코드 내부에서 Java 코드를 호출할 수 있도록 합니다.
그러나 자바 외부에 대한 호출은 다른 플랫폼에 이식할 수 없으며 앱에서 안전 이상을 일으킬 수 있다.로컬 코드를 실행하면 자바 응용 프로그램이 100% 순수 자바 테스트를 통과할 수 없습니다.그러나 로컬 호출을 수행해야 하는 경우 몇 가지 지침을 고려해야 합니다.
1. 모든 로컬 방법을 하나의 클래스에 봉인합니다. 이 클래스는 하나의 DLL을 호출합니다.각 대상 운영 체제 플랫폼에 대해 적절한 플랫폼별 버전의 DLL을 사용할 수 있습니다.이렇게 하면 로컬 코드의 영향을 최소화할 수 있고 앞으로 필요한 이식 문제를 고려하는 데 도움이 된다.
2. 현지 방법은 가능한 한 간단하다.로컬 메서드가 Microsoft를 포함한 타사에서 실행될 때 DLL에 대한 의존도를 최소화할 수 있습니다.DLL과 애플리케이션을 로드하는 데 필요한 비용을 최소화하기 위해 로컬 방법을 최대한 독립적으로 사용하십시오.실행이 필요한 경우 DLL을 애플리케이션과 함께 제공해야 합니다.
JNI 작성 단계는 다음과 같습니다.
a. HelloWorld를 작성합니다.java 클래스
class HelloWorld{
public native void hello();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().hello();
}
}
b. 번역javac HelloWorld.java
c. 생성.h 파일
javah -jni HelloWorld
생성 내용은 다음과 같습니다.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
첫 번째 매개변수는 JNI 메서드를 호출할 때 사용하는 JNI Environment 포인터입니다.두 번째 매개 변수는 이 자바 코드에서 실례화된 자바 대상인 HelloWorld를 가리키는 핸들입니다.다른 매개 변수는 방법 자체의 매개 변수이다d.c 구현
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World!
");
return;
}
그 중에서 첫 번째 줄은 jni를h 파일 도입 (%JAVA_HOME%\include 디렉터리에서) 에는 JNIENv와jobject의 정의가 있습니다.e. 컴파일 c 구현
Windows에서 예를 들어, dll 파일을 생성해야 합니다.HelloWorldImpl을 저장합니다.c 폴더 아래에 VC의 컴파일러cl를 사용합니다.
cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
참고: 생성된 dll 파일 이름은 옵션 - Fe 뒤에 설정됩니다. HelloWorld이기 때문입니다.java 파일에서 우리loadLibary에서 사용하는 이름은 hello입니다.물론 여기도 수정하고 거기도 수정해야 돼요.또한 - I%java_home%\include -I%java_home%\include\win32 매개 변수 추가, 네 번째 단계에서 로컬 방법을 작성할 때 jni를 도입했기 때문입니다.h 파일.
f. 실행 프로그램
자바 헬로 월드는 오케이!
다음은 자바의 네이티브 키워드에 대한 상세한 소개입니다. 여러분의 학습에 도움이 되었으면 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.