jni 예제 리눅스

이 섹션에는 일반적으로 사용되고 공개적으로 사용할 수 있는 샘플 JNI 코드를 기반으로 하는 예제가 포함되어 있으며 POWER에서 Linux에서 이러한 예제를 컴파일하는 방법을 보여 주시면 됩니다. JNI 프로그래밍에 대한 추가 정보는 다음 developerWorks 문서에서 찾을 수 있습니다: 전원 아키텍처에 리눅스에 대한 자바 환경 (2004 년 10 월) 및 AIX에 JNI 프로그래밍 (3 월 2004). 컴파일우리는 이제 우리의 프로그램을 컴파일하고 실행할 준비가되어 있습니다. 컴파일은 시스템에 따라 다릅니다. 이렇게 하면 libHelloImpl.so 또는 HelloImpl.dll(O/S에 따라 다름)이 생성됩니다. 컴파일된 라이브러리가 저장되는 디렉터리를 가리키도록 LD_LIBRARY_PATH를 설정합니다. Java 응용 프로그램을 실행합니다. 예를 들어, 리눅스에서 Hello.c를 컴파일하려면 다음과 같이 VM 옵션 -Djava.library.path=/path/to/lib를 통해 “hello.dll”(Windows), “libHello.so”(유닉스), “libhello.dylib”(Mac OS X)의 Java 라이브러리 경로를 명시적으로 지정해야 할 수 있습니다. 이 예제에서는 네이티브 라이브러리가 현재 디렉터리 `.`에 유지됩니다. 코드를 테스트하기 위해 이전 HelloWorld 예제의 모든 컴파일 단계를 반복해야 합니다. 스칼라와 Java 예제 모두 네이티브 구현은 동일합니다. 코드는 다르지만 C 또는 C++에서 구현을 작성할 수 있습니다.

아래 샘플은 C++에서 Sample1.h에 정의된 모든 메서드를 구현합니다. 아래 코드를 복사하여 Sample1.cpp라는 파일에 붙여 넣기: JNI는 Java가 다른 언어로 작성된 코드와 상호 작용할 수 있는 인터페이스입니다. JNI에 대한 동기 부여는 코드 재사용성과 성능입니다. WIth JNI, Java(대부분 C/C++)로 기존/레거시 코드를 재사용할 수 있습니다. 성능 면에서 네이티브 코드는 해석 모드에서 실행할 때 Java보다 최대 20배 더 빨랐습니다. 현대 JIT 컴파일러 (핫 스팟)는이 moot 포인트를 합니다. JNI는 C/C++로 작성된 응용 프로그램과 같이 기본적으로 작성된 응용 프로그램 내에서 Java 코드를 호출하는 데도 사용할 수 있습니다. 실제로 Java 명령줄 유틸리티는 Java 가상 머신에서 Java 코드를 실행한 응용 프로그램의 예입니다. JNI Componentsjavah는 네이티브 메서드를 포함하는 지정된 Java 클래스에서 C 스타일 헤더 파일을 빌드하는 JDK 도구입니다.

Java 메서드 서명을 네이티브 함수 prototypesjni.h에 적용하면 Java 형식을 네이티브 함수에 매핑하는 JDK에 포함된 C/C++ 헤더 파일입니다. javah는 자동으로 응용 프로그램 헤더 파일에이 파일을 포함합니다. 변수의 JNI 데이터 형식 매핑 IBM XL C/C++ 컴파일러는 POWER™ 프로세서의 성능에 매우 최적화된 바이너리를 생성할 수 있으며, 대부분의 경우 C/C++ 코드의 성능을 크게 향상시킬 수 있습니다. 리눅스용 IBM XL C/C++ 컴파일러는 GNU C/C++ 컴파일러와 매우 호환되며 GNU C/C++ 컴파일러 플래그를 IBM XL C/C++ 컴파일러의 해당 명령으로 변환한 다음 호출하는 gxl* 컴파일러 변형도 포함합니다. 이렇게 하면 IBM XL C/C++ 컴파일러로 전환할 때 GNU 컴파일러용으로 작성된 Makefile의 이식성이 크게 간소화됩니다. 이 C++ 예제에서는 JNI 호출 API를 사용하는 방법을 보여 주며, 즉 JVM을 기본 C/C++ 코드에 포함시킨 다음 Java로 작성된 응용 프로그램의 일부를 실행하도록 호출하는 방법을 보여 주었습니다. 참조 관리는 효율적인 프로그램을 작성하는 데 매우 중요합니다. 예를 들어 FindClass(), GetMethodID(), GetFieldID() 를 사용하여 네이티브 함수 내에서 jclass, jmethodID 및 jfieldID를 검색하는 경우가 많습니다. 반복 호출을 수행하는 대신 값을 한 번 가져오고 후속 사용을 위해 캐시하여 오버헤드를 제거해야 합니다.

이 마지막 예제에서는 Java 개체를 기본 C++ 코드로 조작하는 방법을 살펴보겠습니다. 스칼라를 사용하면 현재 더 이상 사용되지 않는 javah 도구를 사용하지 않아도됩니다. javah가 클래스 경로에 스칼라 라이브러리를 가져야 할 수도 있으므로 이전 예제보다 약간 더 관련이 있습니다.* 이 예제에서는 스칼라 라이브러리.jar을 포함하여 어떻게 수행되는지 설명합니다.

Comments are closed.