로 컬 방법 호출 1

4022 단어 자바jni
아,오 랜 만 에 블 로 그 를 썼 는데 업데이트 가 적응 이 안 돼 요.이거...그 나 저 나 결혼 휴가 를 다 녀 오 면 계속 느낌 이 없어 요.지금도 기분 이 좋 지 는 않 지만 그래도 hold~
오늘부터 jni 를 만들어 야 겠 다.그렇지 않 으 면 1 년 동안 계획 을 자주 정리 하지 못 할 것 이다.
자바 의 책 은 항상 잘 말 합 니 다.100%순수 자바 의 해결 방안 은 매우 좋 지만 자바 의 성능 은 정말 c 와 c+보다 못 합 니 다.일반적인 변명 회 는 인터넷 io 야 말로 진정한 병목 등 구름 이다.ok,맞아요.하나?이 말 이 왜 이렇게 익숙 하지?)자바 의 속 도 는 확실히 c 와 c+보다 못 해서 많은 경우 에 사용자 의 응답 에 있어 서 확실히 원활 하지 않 은 느낌 을 받 을 수 있 습 니 다.물론 흠 잡 을 데 가 없다.자바 가 매우 강하 고 대체 하기 어 려 울 때 가 많다.
오늘 은 자바 에서 c 함수 로 어떻게 바 꾸 는 지 입문 편 을 먼저 보 여 드 리 겠 습 니 다.
우선 네 이 티 브 해명.
native 는 하나의 방법 을 설명 한 후에 방법 체 를 더 이상 쓰 지 않 아 도 됩 니 다.실현 은 아래 에서 진행 되 기 때 문 입 니 다.
코드 를 보 겠 습 니 다:

class HelloNative{
    public static native void greeting();
}

static 는 필수 가 아 닙 니 다.
실제로 이 종 류 를 사용 할 수 있 지만 프로그램 에서 사용 할 때 가상 컴퓨터 는 greeting 을 어떻게 찾 는 지 모 르 고 Unsatisfied LinkError 이상 을 보고 합 니 다.로 컬 코드 를 실현 하기 위해 서 는 응답 하 는 c 함 수 를 만들어 야 합 니 다.자바 규칙 에 따라 이 함 수 를 완전히 명명 해 야 합 니 다.
1)완전한 자바 방법 명 을 사용 합 니 다.예 를 들 어 HelloNativ.greeting.클래스 가 어떤 가방 을 입력 하면 앞 에 신청 을 추가 합 니 다.예 를 들 어 com.horstmann.HelloNative.greeting.
2)밑줄 로 모든 마침 표를 바 꾸 고 자바접두사HelloNative_greeting 혹은 자바com_horstmann_HelloNative_greeting。
3)만약 클래스 이름 에 비 ASCII 자모 나 숫자 가 포함 되 어 있다 면,예 를 들 어'','$'혹은'\u007 f'보다 큰 유 니 코드 문자 로0xxx 는 이 문자 의 값 인 16 진수 4 개 를 대체 합 니 다.
(주의,greeting()과 greeting(int i)두 가지 방법 이 있다 면 접미사 에 밑줄 두 개 를 추가 해 야 합 니 다.그 다음 에 인 코딩 된 매개 변수 유형 을 추가 해 야 합 니 다:자바HelloNative_greeting__자바HelloNative_greeting__I)
귀 찮 죠?긴장 하지 마 세 요.이 물건 들 은 자동 으로 생 성 될 수 있 습 니 다.먼저 자바 c 를 사용 하여 자바 파일 을 컴 파일 한 다음 자바 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:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

다음은 Hello Native.c 파일 에서 만 이 성명 을 실현 하 는 방법 을 사용 하면 됩 니 다.

#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv* env, jclass cl){
    printf("hello native world!
"); }

C++도 가능 합 니 다.

extern "C"
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv* env, jclass cl){
    cout<<"hello native world!"<<endl;
}

ok,우 리 는 이.c 파일 을 Liux 에서 컴 파일 할 수 있 습 니 다.명령:
gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c

자,생 성 된 so 를 사용 할 수 있 습 니 다.물론 가상 컴퓨터 가 라 이브 러 리 load 를 가장 먼저 들 어가 도록 정적 초기 화 코드 블록 을 사용 해 야 합 니 다.

class HelloNativeTest{
    static{
        System.loadLibrary("HelloNative");
    }

    public static void main(String[] args){
        HelloNative.greeting();
    }
}

Liux 에 서 는 현재 디 렉 터 리 를 라 이브 러 리 경로 에 추가 해 야 합 니 다.실현 방식 은 LD 설정 을 통 해LIBRARY_PATH 환경 변수:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
아니면 자바.library.path 시스템 속성 을 설정 합 니 다.
java -Djava.library.path=. HelloNaticeTest
자,자바 가 우 리 를 찾 을 수 있 습 니 다.
일부 로 컬 코드 의 공유 라 이브 러 리 는 초기 화 코드 를 먼저 실행 해 야 합 니 다.초기 화 코드 를 JNI 에 넣 으 셔 도 됩 니 다.온 로드 방법 중 에유사 한 것 은 이 방법 을 제공 하면 가상 컴퓨터 가 꺼 지면 JNI 를 호출 합 니 다.OnUnload 방법.
그들의 원형 은:
jint JNI_OnLoad(JavaVM* vm, void* reserved);
void JNI_OnUnLoad(JavaVM* vm, void* reserved);
OnLoad 는 필요 한 가상 컴퓨터 의 최신 버 전 을 되 돌려 줍 니 다.예 를 들 어:
JNI_VERSION_1_2.
이제 위 에서 아래로 의 호출 이 모두 명확 해 졌 으 니 다음 에 우리 다시 깊이 들 어가 자.

좋은 웹페이지 즐겨찾기