Java의 native 키워드 상세 정보

4941 단어 Javanative키워드
하나.네이티브 메서드
간단하게 말하면 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.native 성명이 있는 방법을 작성한 자바 클래스
  • b.javac 명령을 사용하여 작성된 Java 클래스를 컴파일합니다
  • c. 자바-jni*****를 사용하여 접두사 이름을 생성합니다.h의 헤더 파일
  • d. 다른 언어(C, C++)를 사용하여 로컬 방법을 구현합니다
  • e. 로컬 방법으로 작성된 파일을 동적 링크 라이브러리로 생성합니다
  • 다음은 Java에서 로컬 C 프로그램을 호출하는 간단한 예입니다.
    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. 실행 프로그램
    자바 헬로 월드는 오케이!
    다음은 자바의 네이티브 키워드에 대한 상세한 소개입니다. 여러분의 학습에 도움이 되었으면 합니다.

    좋은 웹페이지 즐겨찾기