1. 기본 방법이란 무엇입니까?
간단히 말해서, 기본 메소드는 Java가 자바 코드가 아닌 코드를 호출하는 인터페이스입니다. 기본 방법은 Java 방법입니다.이 방법의 구현은 C와 같은 비 Java 언어로 구현됩니다.이 기능은 Java에 고유하지 않습니다. 다른 많은 프로그래밍 언어에는이 메커니즘이 있습니다. 예를 들어 C ++에서는 외부 "C"를 사용하여 C ++ 컴파일러에 C 기능을 호출하도록 지시 할 수 있습니다.
"기본 방법은 Java 코드가 아닌 코드가 구현하는 Java 방법입니다."
기본 방법을 정의 할 때 구현 본문은 제공되지 않습니다 (일부는 Java 인터페이스를 정의하는 것과 같습니다). , 예는 다음과 같습니다.
패키지 java.lang; 공개 클래스 개체 {...... 공개 최종 기본 클래스 <?> getClass (); 공개 기본 int hashcode (); 보호 된 기본 객체 클론 ()는 ClonenOntSupportedException을 던졌습니다. 공개 최종 기본 void notify (); 공개 최종 기본 void notifyall (); 공개 최종 기본 무효 대기 (긴 타임 아웃)는 중단 된 예를 던졌습니다. ......}식별자 기본은 초록을 제외한 다른 모든 Java 식별자와 함께 사용할 수 있습니다. 이 방법은 이러한 방법이 구현 기관을 가지고 있음을 암시하지만 이러한 구현 기관에는 자바가 아니지만 추상적으로 이러한 방법은 이러한 방법이 구현 기관이 없음을 나타냅니다. 기본 및 기타 Java 식별자가 사용되는 경우, 그 의미는 비 네이티브 방법의 의미와 다르지 않습니다.
기본 방법 방법은 비-프리맨티 유형을 포함하여 모든 Java 유형을 반환 할 수 있으며 예외 제어를 수행 할 수도 있습니다. 이러한 방법의 구현은 예외를 만들어 버릴 수 있으며, 이는 Java의 방법과 매우 유사합니다.
기본 방법의 존재는 이러한 로컬 방법을 호출하는 다른 클래스에 영향을 미치지 않습니다. 실제로, 이러한 방법을 호출하는 다른 클래스는 그것이 로컬 방법을 호출하고 있다는 것을 알지 못합니다. JVM은 로컬 방법을 호출하는 모든 세부 사항을 제어합니다.
로컬 메소드를 포함하는 클래스가 상속되면 서브 클래스는 로컬 메소드를 상속하고 Java로 메소드를 다시 쓸 수 있습니다 (이것은 조금 이상해 보입니다). 마찬가지로, 로컬 방법이 Fianl에 의해 식별되는 경우 상속 된 후에는 다시 작성할 수 없습니다.
로컬 방법은 JVM을 효과적으로 확장하기 때문에 매우 유용합니다. 실제로, 우리가 쓴 Java 코드는 로컬 방법을 사용했습니다. Sun의 Java 동시성 (멀티 스레딩) 메커니즘을 구현할 때 운영 체제의 많은 접촉 지점은 로컬 방법을 사용하여 Java 프로그램이 Java 런타임의 경계를 초과 할 수있게합니다. 로컬 방법을 사용하면 Java 프로그램은 모든 응용 프로그램 수준 작업을 수행 할 수 있습니다.
2. 사용 방법
기본 키워드는 수정 방법이 원래 메소드임을 나타냅니다. 메소드의 해당 구현은 현재 파일이 아니라 다른 언어 (예 : C 및 C ++)로 구현 된 파일에 있습니다. Java 언어 자체는 운영 체제의 기본 계층에 액세스하고 운영 할 수 없지만 JNI 인터페이스를 사용하여 다른 언어를 호출하여 기본 계층에 액세스 할 수 있습니다.
JNI는 Java 소프트웨어 개발 키트 (SDK)의 일부인 기본 프로그래밍 인터페이스 인 Java 기본 인터페이스입니다. JNI는 Java 코드가 다른 언어로 작성된 코드 및 코드베이스를 사용할 수 있도록합니다. 호출 API (JNI의 일부)는 JVM (Java Virtual Machines)을 기본 응용 프로그램에 포함시키는 데 사용될 수 있으므로 프로그래머는 내부 기본 코드에서 Java 코드를 호출 할 수 있습니다.
그러나 외부 Java에 대한 호출은 일반적으로 다른 플랫폼으로 포팅 될 수 없으며 애플릿에서 보안 예외도 제기 될 수 있습니다. 기본 코드를 구현하면 Java 응용 프로그램이 100% 순수한 Java 테스트를 통과하지 못하게됩니다. 그러나 로컬 통화를 수행 해야하는 경우 다음과 같은 몇 가지 지침이 있습니다.
1. 모든 로컬 방법을 단일 DLL을 호출하는 클래스로 캡슐화하십시오. 각 대상 운영 체제 플랫폼에 대해 적절한 플랫폼에 특정한 DLL 버전을 사용할 수 있습니다. 이것은 로컬 코드의 영향을 최소화하고 나중에 필요한 포팅 문제를 고려하는 데 도움이됩니다.
2. 로컬 방법은 가능한 한 간단합니다. Microsoft (Microsoft 포함) 런타임 DLL에 대한 로컬 방법의 의존성을 최소화하십시오. DLL 및 응용 프로그램을로드하는 데 필요한 오버 헤드를 최소화하기 위해 로컬 방법을 최대한 독립적으로 만드십시오. 런타임 DLL이 필요한 경우 응용 프로그램이 제공되어야합니다.
JNI의 쓰기 단계는 다음과 같습니다.
다음은 Java에서 로컬 C 프로그램을 호출하는 간단한 예입니다.
에이. Helloworld.java 클래스를 작성하십시오
클래스 helloworld {public avix void hello (); static {systation.loadlibrary ( "hello");} public static void main (string [] args) {new HelloWorld (). hello ();}}비. 번역
Javac Helloworld.java
기음. .h 파일을 생성합니다
Javah -Jni Helloworld
생성 된 컨텐츠는 다음과 같습니다.
/*이 파일을 편집하지 마십시오 - 기계가 생성됩니다*/#class helloWorld*/#ifndef _included_hellyorld#define _included_helloworld#ifdef __cplusplusextern "c"{#endif/** class : helloworld* 방법 : hello* supation () v */jniexport void jnicall java_hellowld_hello (jnienv *, jobject);#ifdef __cplusplus}#endif#endif첫 번째 매개 변수는 JNI 메소드를 호출 할 때 사용되는 JNI 환경 포인터입니다. 두 번째 매개 변수는이 Java 코드에서 인스턴스화 된 Java Object Helloworld의 핸들입니다. 다른 매개 변수는 메소드 자체의 매개 변수입니다
DC 구현
#include <jni.h> #include "helloorld.h"#include <stdio.h> jniexport void jnicall jnicall java_helloworld_hello (jnienv *env, labject obj) {printf ( "hello world!/n"); return;}그 중 첫 번째 줄은 jni.h 파일 ( %java_home %/include directory)을 소개하는 것입니다.
이자형. C 구현을 컴파일하십시오
여기에서 Windows를 예로 들어 DLL 파일을 생성해야합니다. Save HelloWorlDimpl.c 폴더에서 VC 컴파일러를 사용하여 생성하십시오.
cl -i%java_home%/포함 -i%java_home%/include/win32 -ld helloworldimp.c -fehello.dll
참고 : 생성 된 dll 파일 이름은 옵션 -fe 후에 구성되어 있습니다. 여기에 hello가 있습니다. helloworld.java 파일에서 loadlibary를 사용할 때 사용하는 이름은 hello이기 때문입니다. 물론 여기에서 수정 한 후에는 수정해야합니다. 또한, -i%java_home%/포함 -i%java_home%/incland
에프. 프로그램을 실행하십시오
Java Helloworld는 괜찮습니다!
위의 내용은 Java의 기본 키워드에 대한 자세한 소개이며 모든 사람의 학습에 도움이되기를 바랍니다.