로 컬 방법 호출 1
오늘부터 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.
이제 위 에서 아래로 의 호출 이 모두 명확 해 졌 으 니 다음 에 우리 다시 깊이 들 어가 자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.