자바 네 이 티 브 키워드 원리 및 역할 분석

4969 단어 JavaNative키워드
native 를 처음 만난 것 은 자바.lang.Object 소스 코드 의 hashCode 방법 입 니 다.public native int hashCode();왜 네 이 티 브 가 있 지?이것 은 내 가 배 워 야 할 곳 이다.그래서 다음은 네 이 티 브 를 정리 하고 싶 습 니 다.
첫째,인식 native 즉 JNI,자바 네 이 티 브 인터페이스
모든 언어 는 순수 하 기 를 바란다.예 를 들 어 어떤 방안 을 해결 하 는 것 을 모두 좋아 하 는데 이 언어 만 쓰 면 된다.자바 플랫폼 에는 자바 네 이 티 브 인터페이스(자바 로 컬 인터페이스)라 는 사용자 와 로 컬 C 코드 가 서로 작 동 하 는 API 가 있 습 니 다.
2.자바 로 C 의"Hello,JNI"를 호출 합 니 다.
우 리 는 퇴근 하기에 편리 한 절차 에 따라 진행 해 야 한다.
1.자바 클래스 를 만 듭 니 다.네 이 티 브 방법 과 라 이브 러 리 를 불 러 오 는 방법 loadLibrary 가 포함 되 어 있 습 니 다.HelloNative.java 코드 는 다음 과 같 습 니 다.

public class HelloNative
{
  static
  {
    System.loadLibrary("HelloNative");
  }
   
  public static native void sayHello();
   
  @SuppressWarnings("static-access")
  public static void main(String[] args)
  {
    new HelloNative().sayHello();
  }
}
우선 네 이 티 브 방법 에 주목 하 세 요.그 로 딩 라 이브 러 리 는 뒤로 도 작용 합 니 다.native 키 워드 는 컴 파일 러(사실은 JVM)가 외부 에서 정의 하 는 방법 을 호출 하 는 것 을 알려 줍 니 다.여기 서 C 를 말 합 니 다.이 코드 를 직접 실행 하면 JVM 은"A Java Exception has occurred."콘 솔 출력 은 다음 과 같 습 니 다.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at HelloNative.(HelloNative.java:5)
이것 은 프로그램 이 그것 을 사용 할 때 가상 컴퓨터 가 sayHello 를 어떻게 찾 아야 할 지 모른다 고 말 했다.자연 미장이
2.javah 를 실행 하여 이 방법 을 포함 하 는 C 성명 헤더 파일 을 얻 습 니 다.h
HelloNative.java,간단하게 javac javah,그림 참조
아래 HelloNative.h 파일 을 얻 었 습 니 다:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
 
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   HelloNative
 * Method:  sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_sayHello
 (JNIEnv *, jclass);
 
#ifdef __cplusplus
}
#endif
#endif
jni.h 이 파일 은/%JAVA 에 있 습 니 다.HOME%include
3.헤더 파일 에 따라 C 를 써 서 로 컬 방법 을 실현 합 니 다.
여기 서 우 리 는 간단하게 이 sayHello 방법 을 다음 과 같이 실현 합 니 다.

#include "HelloNative.h"
#include <stdio.h>
 
JNIEXPORT void JNICALL Java_HelloNative_sayHello
{
  printf("Hello,JNI");  
}
4.dll 공유 라 이브 러 리 를 생 성 한 다음 에 자바 프로그램 load 라 이브 러 리 를 호출 하면 됩 니 다.
Windows 에서 MinGW GCC 는 다음 과 같이 실 행 됩 니 다.
gcc -m64 -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.7.0_71\include" -I"C:\Program Files\Java\jdk1.7.0_71\include\include\win32" -shared -o HelloNative.dll HelloNative.c
-m64 는 dll 라 이브 러 리 생 성 이 64 비트 임 을 나타 낸다.그리고 HelloNative 를 실행 합 니 다:
java HelloNative
마침내 콘 솔 인쇄 를 성공 적 으로 볼 수 있 습 니 다.
Hello,JNI
3.JNI 호출 C 흐름 도

기타 소개
native 는 C++와 공동 개발 할 때 쓰 는 거 예요!자바 자체 개발 안 써 도 돼!
native 키 워드 를 사용 하여 이 방법 이 원생 함수 임 을 설명 합 니 다.즉,이 방법 은 C/C++언어 로 이 루어 졌 고 DLL 로 컴 파일 되 어 자바 에서 호출 되 었 습 니 다.
이 함수 들 의 실현 체 는 DLL 에 있 습 니 다.JDK 의 소스 코드 에는 포함 되 지 않 습 니 다.보이 지 않 을 것 입 니 다.서로 다른 플랫폼 에 대해 서도 다르다.이것 도 자바 의 바 텀 메커니즘 입 니 다.실제로 자바 는 서로 다른 플랫폼 에서 서로 다른 native 방법 으로 운영 체제 에 대한 방문 을 실현 합 니 다.
1。native 는 자바 와 다른 언어(예 를 들 어 c++)로 협업 할 때 사용 합 니 다.
즉,native 후의 함수 실현 은 자바 로 쓴 것 이 아 닙 니 다.
2。자바 가 아 닌 이상 소스 코드 는 신경 쓰 지 마 세 요.
  • native 는 운영 체제 에 알 리 는 것 을 의미한다
  • 4.567917.이 함 수 는 내 가 사용 해 야 하기 때문에 나 에 게 실현 해 야 한다
  • 그래서 native 키워드 의 함 수 는 모두 운영 체제 에서 이 루어 진 것 입 니 다
  • 자바 호출 만 가능 합 니 다자바 는 크로스 플랫폼 의 언어 입 니 다.플랫폼 을 뛰 어 넘 은 이상 지불 하 는 대 가 는 바 텀 에 대한 통 제 를 희생 하 는 것 입 니 다.자바 가 바 텀 에 대한 통 제 를 실현 하려 면 다른 언어의 도움 이 필요 합 니 다.이것 이 바로 native 의 역할 입 니 다.
    자바 는 완벽 하지 않 습 니 다.자바 의 부족 은 운영 속도 가 전통 적 인 C++보다 훨씬 느 린 것 을 제외 하고 자바 는 운영 체제 의 바 텀(예 를 들 어 시스템 하드웨어 등)에 직접 접근 할 수 없습니다.이 를 위해 자바 는 native 방법 으로 자바 프로그램의 기능 을 확장 할 수 있 습 니 다.
    native 방법 을 자바 프로그램 과 C 프로그램의 인터페이스 에 비유 할 수 있 습 니 다.그 실현 절차:
    1.자바 에서 native()방법 을 설명 한 다음 에 컴 파일 합 니 다.
    2.자바 로.h 파일 만 들 기;
    3..cpp 파일 을 작성 하여 native 내 보 내기 방법 을 실현 합 니 다.그 중에서 두 번 째 단계 에서 발생 하 는.h 파일 을 포함 해 야 합 니 다(JDK 테이프 의 jni.h 파일 도 포함 되 어 있 음 을 주의 하 십시오).
    4.세 번 째 단계 의.cpp 파일 을 동적 링크 라 이브 러 리 파일 로 컴 파일 합 니 다.
    5.자바 에서 System.loadlLibrary()방법 으로 네 번 째 단계 에서 발생 하 는 동적 링크 라 이브 러 리 파일 을 불 러 옵 니 다.이 native()방법 은 자바 에서 접근 할 수 있 습 니 다.
    JAVA 로 컬 방법 적용 현황
    1.바 텀 호스트 플랫폼 의 특정한 특성 을 사용 하기 위해 서 이 기능 은 JAVA API 를 통 해 접근 할 수 없습니다.
    2.오래된 시스템 에 접근 하거나 기 존 라 이브 러 리 를 사용 하기 위해 서 이 시스템 이나 라 이브 러 리 는 JAVA 로 작 성 된 것 이 아 닙 니 다.
    3.프로그램의 성능 을 가속 화하 기 위해 한동안 민감 한 코드 를 로 컬 방법 으로 실현 한다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기