programing

Java의 네이티브 키워드는 무엇입니까?

goodsources 2022. 8. 15. 21:40
반응형

Java의 네이티브 키워드는 무엇입니까?

퍼즐(Java 키워드 trivia 게임)을 하다가 우연히 알게 되었습니다.native키워드를 지정합니다.

Java의 native 키워드는 무엇에 사용됩니까?

최소 실행 가능 예시

Main.java

public class Main {
    public native int square(int i);
    public static void main(String[] args) {
        System.loadLibrary("Main");
        System.out.println(new Main().square(2));
    }
}

메인.c

#include <jni.h>
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_square(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}

컴파일 및 실행:

sudo apt-get install build-essential openjdk-7-jdk
export JAVA_HOME='/usr/lib/jvm/java-7-openjdk-amd64'
javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
  -I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main

출력:

4

Ubuntu 14.04 AMD64로 테스트.Oracle JDK 1.8.0_45에도 대응.

GitHub의 예에서는, 가지고 놀 수 있습니다.

패키지은 Java "/"로 ._1에서 설명한 바와 같이 C 함수 이름에서: 밑줄이 포함된 Android 패키지 이름에서 JNI 함수 호출

해석

native을 사용하다

  • Java에서 임의의 어셈블리 코드를 사용하여 동적으로 로드된 컴파일된 라이브러리(여기서는 C로 작성)를 호출한다.
  • 결과를 Java로 되돌립니다.

이것은, 다음의 경우에 사용할 수 있습니다.

  • 더 나은 CPU 어셈블리 명령을 사용하여 중요한 섹션에 더 빠른 코드 쓰기(CPU 휴대용이 아님)
  • 시스템에 직접 콜을 발신한다(OS 포터블)

휴대성이 떨어지는 단점이 있습니다.

C에서 Java를 호출하는 것도 가능하지만 먼저 C에서 JVM을 생성해야 합니다: How to call Java functions from C++?

Python, Node.js, Ruby와 같은 이유로 유사한 네이티브 확장 API가 많은 다른 "VM 언어"에도 존재합니다.

안드로이드 NDK

Android 보일러 플레이트를 사용하여 셋업해야 한다는 점만 제외하면 이 문맥에서 개념은 동일합니다.

공식 NDK 저장소에는 hello-jni 앱과 같은 "표준" 예가 포함되어 있습니다.

안의 ★★★★★unzip한 사람.apkO 의 를 하면, 된 Android O 의 NDK 를 할 수 있습니다..so합니다.lib/arm64-v8a/libnative-lib.so.

confirm 나아가 TODO confirm:file /data/app/com.android.appname-*/oat/arm64/base.odex공유 라이브러리라고 합니다.이 라이브러리는 AOT가 ART의 Java 파일에 대응하는 사전 컴파일된 .dex라고 생각합니다.다음도 참조해 주십시오.Android의 ODEX 파일은 무엇입니까?따라서 Java도 실제로 v-center Server를 통해 실행되었을 수 있습니다.native★★★★★★★★★★★★★★★★★★?

OpenJDK 8의 예

어디 있는지 Object#clonejdk8u60-b27에 정의되어 있습니다.

이 명령어는 다음 명령어를 사용하여 구현됩니다.native불러.

먼저 다음 사항을 확인합니다.

find . -name Object.java

jdk/src/share/classes/java/lang/Object.java#l212로 이동합니다.

protected native Object clone() throws CloneNotSupportedException;

이제 가장 어려운 부분은 복제품이 어디에 있는지 찾는 것입니다.도움이 된 질문은 다음과 같습니다.

find . -iname object.c

오브젝트의 네이티브 메서드를 구현할 수 있는 C 또는 C++ 파일을 찾습니다.jdk/share/native/java/lang/Object.c#l47:

static JNINativeMethod methods[] = {
    ...
    {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
};

JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
    (*env)->RegisterNatives(env, cls,
                            methods, sizeof(methods)/sizeof(methods[0]));
}

그 결과 우리는JVM_Clone기호:

grep -R JVM_Clone

hotspot/src/share/vm/prims/jvm.cpp#l580으로 이동합니다.

JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
    JVMWrapper("JVM_Clone");

매크로를 많이 확장한 결과, 이것이 정의 포인트라는 결론에 도달했습니다.

이것은 자바가 아닌 다른 언어로 구현되는 방법을 표시합니다.JNI(Java Native Interface)와 연동됩니다.

과거에는 성능 크리티컬 섹션을 작성하기 위해 네이티브 메서드가 사용되었지만, Java의 속도가 빨라짐에 따라 이제는 이러한 방법이 거의 보편화되지 않았습니다.현재 네이티브 메서드는 다음과 같은 경우에 필요합니다.

  • 다른 언어로 작성된 Java에서 라이브러리를 호출해야 합니다.

  • 다른 언어(일반적으로 C)에서만 도달할 수 있는 시스템 또는 하드웨어 리소스에 액세스해야 합니다.실제로 실제 컴퓨터와 상호 작용하는 많은 시스템 기능(예를 들어 디스크 및 네트워크 IO)은 네이티브 코드를 호출하기 때문에 이 기능만 수행할 수 있습니다.

'Java 네이티브인터페이스 사양'도 참조해 주세요.

native키워드는 메서드가 네이티브코드로 구현되어 있는 것을 나타내는 메서드에 대해서는, Java Native Interface(JNI)를 사용합니다.

Java Language Specification에서 직접 참조:

이 방법은native는 플랫폼 의존 코드로 구현되며, 일반적으로 C, C++, FORTRAN 또는 어셈블리 언어 등의 다른 프로그래밍 언어로 작성됩니다.의 몸통nativemethod는 블록 대신 구현이 생략되었음을 나타내는 세미콜론으로만 표시됩니다.

SLaks가 응답한 바와 같이native키워드는 네이티브코드를 호출하기 위한 것입니다.

또한 GWT에서 javascript 메서드를 구현하기 위해 사용합니다.

네이티브 코드를 구현하는 함수는 네이티브로 선언됩니다.

Java Native Interface(JNI; Java 네이티브 인터페이스)는 Java Virtual Machine(JVM; Java 가상 머신)에서 실행되는 Java 코드가 네이티브 애플리케이션(하드웨어 및 운영 체제 플랫폼 전용 프로그램) 및 C, C++, 어셈블리 등의 다른 언어로 작성된 라이브러리를 호출하고 호출할 수 있도록 하는 프로그래밍 프레임워크입니다.

http://en.wikipedia.org/wiki/Java_Native_Interface

Native is Non access modifier.it은 Method에만 적용할 수 있습니다.이는 메서드 또는 코드의 플랫폼 의존형 구현을 나타냅니다.

native는 java 키워드입니다.이 키워드는 구현되지 않은 구조(클라이언트)를 추상화하지만 네이티브코드 등의 플랫폼에 의존하며 Java 스택이 아닌 네이티브스택에서 실행됩니다.

  • native자바어
  • native메서드는 Java(JNI)와 다른 프로그래밍 언어 간의 인터페이스 역할을 합니다.

nativemethod는 기능적 또는 성능적 이유로 Java 코드가 OS 네이티브코드를 호출하는 메커니즘을 제공합니다.

예:

606  public native int availableProcessors();
617  public native long freeMemory();
630  public native long totalMemory();
641  public native long maxMemory();
664  public native void gc();

하는 「」에서Runtime.classOpenJDK 내의 , OpenJDK 내의 , in 、 위 fileJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class에는 이러한 , 이 에 "예", "예", "예", "예", "예", "예" 의 태그를 붙입니다ACC_NATIVE )0x0100이러한 메서드에는 Code Atribute가 포함되어 있지 않습니다.즉, 이러한 메서드에는 실제 코딩 로직이 존재하지 않습니다.Runtime.class 삭제:

  • 13 법 1313availableProcessors, : " " " " " " " " "
  • 14 법 14freeMemory, : " " " " " " " " "
  • 15 법 1515totalMemory, Atribut : " " " " " " " " " " "
  • 16 법 16maxMemory, Atribut : " " " " " " " " " " "
  • 17 법17gc, : " " " " " " " " "

여기에 이미지 설명 입력

사실 코딩 로직은 대응하는 Runtime.c 파일에 있습니다.

42  #include "java_lang_Runtime.h"
43
44  JNIEXPORT jlong JNICALL
45  Java_java_lang_Runtime_freeMemory(JNIEnv *env, jobject this)
46  {
47      return JVM_FreeMemory();
48  }
49
50  JNIEXPORT jlong JNICALL
51  Java_java_lang_Runtime_totalMemory(JNIEnv *env, jobject this)
52  {
53      return JVM_TotalMemory();
54  }
55
56  JNIEXPORT jlong JNICALL
57  Java_java_lang_Runtime_maxMemory(JNIEnv *env, jobject this)
58  {
59      return JVM_MaxMemory();
60  }
61
62  JNIEXPORT void JNICALL
63  Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
64  {
65      JVM_GC();
66  }
67  
68  JNIEXPORT jint JNICALL
69  Java_java_lang_Runtime_availableProcessors(JNIEnv *env, jobject this)
70  {
71      return JVM_ActiveProcessorCount();
72  }

이 ★★★★★★★★★★★★★★★★★★★★★.C은 딩이에 the the the the the the the the the the the the 로 컴파일 됩니다.libjava.so (Linux) ★★libjava.dll (Windows)에 .JAVA_HOME/jmods/java.base.jmod/lib/libjava.so:

여기에 이미지 설명 입력

여기에 이미지 설명 입력

언급

언급URL : https://stackoverflow.com/questions/6101311/what-is-the-native-keyword-in-java-for

반응형