자바 jni 예제

 

JNI는 Java 형식에 해당하는 기본 시스템에서 다음과 같은 JNI 형식을 정의합니다: 첫째, 메서드의 정의를 만들려면 Java 컴파일러의 -h 플래그를 사용해야 합니다. 그리고 우리가 기대할 수있는 대로 원활하게 작동합니다. java.lang.UnsatisfiedLinkError의 일반적인 실수는 일반적으로 공유 라이브러리의 잘못된 이름 이름(O/S 종속), 검색 경로에 없는 라이브러리 또는 Java 코드에 의해 로드되는 잘못된 라이브러리에서 발생합니다. 헤더는 다음과 같이 C 함수 Java_HelloJNI_sayHello를 선언합니다. 예를 들어, 서명 “Ljava/lang/String;”은 java.lang.String 클래스를 나타냅니다. 또한 접두사 [시그니처에 해당 형식의 배열을 만듭니다., 예를 들어 [int 배열 형식을 의미 합니다. 마지막으로 보이드 시그니처는 V 코드를 사용합니다. 인사하는 것은 좋지만 별로 유용하지 않습니다. 일반적으로 Java와 C++ 코드 간에 데이터를 교환하고 프로그램에서 이 데이터를 관리하고자 합니다.

그런 다음 UserData 형식의 개체를 관리하는 몇 가지 기본 메서드를 사용하여 ExampleObjectsJNI라는 다른 Java 클래스를 만듭니다. 라이브러리 파일 이름은 libHelloImpl.so(유닉스) 또는 HelloImpl.dll(Windows에서)이라고 하지만 Java에서 로드될 때 라이브러리를 HelloImpl.JNI 개발 – C Part1로 로드해야 합니다. 우리는 jDK 자바 유틸리티를 사용하여 sayHi 메서드에 대한 함수 프로토 타입으로 헤더 파일 Hello.h를 생성합니다 : 자바 / 인 / derros / jni / 유틸리티.java와 같은 것을 작성하십시오. 기본 키워드가 Java와 인터페이스하려는 C 및 C++의 함수 및/또는 메서드를 설명하는 것을 볼 수 있습니다. 좋은. 이제 자바 파일이 있습니다. 패키지에 있는 파일의 경우 JNI를 사용하여 프로그램에 복잡성을 더합니다. 또한 JVM에 실행되는 코드와 기본 코드 간에 비용이 많이 드는 통신 계층을 추가합니다. 정적 초기화자는 System.loadLibrary()를 호출하여 클래스 로드 중에 네이티브 라이브러리 “hello”(sayHello()라는 네이티브 메서드가 포함되어 있습니다.)를 로드합니다. Windows에서 “hello.dll”에 매핑됩니다. 또는 유닉스 / 맥 OS X에서 “libhello.so”.

이 라이브러리는 Java의 라이브러리 경로(Java 시스템 변수 java.library.path에 보관)에 포함되어야 합니다. VM 인수 -Djava.library.path=/path/to/lib를 통해 라이브러리를 Java 라이브러리 경로에 포함할 수 있습니다. 런타임에 라이브러리를 찾을 수 없는 경우 프로그램은 불만족LinkError를 throw합니다. 마지막 단계는 정말 System.load 또는 System.loadLibrary를 사용하여 적절한 라이브러리에서로드하고 행운을 위해 손가락을 교차하기 위해 Java 소스 파일을 수정하는 것입니다! 시간 제한으로 인해 추가 질문이 있는 경우 (나는 당신이 가지고 있는) 나는 여기에서 더 많은 하우스 키핑 작업을 설명 할 수 없다. jnihelper.sh 프로토 타입 셸 스크립트의 구현을 살펴보십시오. 나는 당신이 거기에 몇 가지 영감을 찾을 수 있습니다 확신합니다. 공유 라이브러리의 모든 기호를 나열하는 nm을 시도하고 sayHello() 함수를 찾습니다. 함수 이름 Java_HelloJNI_sayHello 를 “T”(정의)로 확인합니다. newObject() 및 newObjectArray() 함수를 통해 네이티브 코드 내에서 jobject 및 jobjectArray를 생성하고 Java 프로그램으로 다시 전달할 수 있습니다.

이 마지막 예제에서는 Java 개체를 기본 C++ 코드로 조작하는 방법을 살펴보겠습니다. Linux 및 Solaris 플랫폼에서 기본 코드가 신호 처리기로 등록되면 JVM용 신호를 가로챌 수 있습니다. 책임 체인을 사용하여 네이티브 코드가 JVM과 더 잘 상호 작동할 수 있습니다.