Gegründet 2006

jni 예제 윈도우

마지막으로 컴파일된 클래스가 저장된 디렉터리에서 응용 프로그램을 실행합니다(예: „클래스“): 감사합니다. JNI를 통해 키보드 나 마우스와 같은 윈도우 API 또는 하드 웨어를 다루는 더 많은 예가 있다면 좋을 것입니다. 좋은 일과 희망은 당신의 쉬운 스타일로 더 많은 것을 배울 수 있습니다. 이 hello-world 예제에서는 이러한 인수를 사용하지 않지만 나중에 사용할 것입니다. 당분간 매크로 JNIEXPORT 및 JNICALL을 무시하십시오. 이것은 Java의 JNI에 대한 예제 리포지토리입니다. 코드는 C ++와 Java로 작성되어 javah 및 javac와 같은 도구를 통해 JNI와 상호 작용하는 올바른 방법을 올바르게 보여줍니다. 또는 CMakeLists.txt는 CMake를 사용하여 JNI 구현과 함께 C++ 라이브러리를 컴파일하고 jnihelper.sh 셸 스크립트는 JNI 라이브러리를 신속하게 프로토타입화할 수 있는 적절한 도우미 유틸리티를 제공합니다. JNI 프레임워크에서 네이티브 함수는 별도의 .c 또는 .cpp 파일로 구현됩니다. (C ++는 JNI와 약간 더 간단한 인터페이스를 제공합니다.) JVM이 함수를 호출하면 JNIEnv 포인터, jobject 포인터 및 Java 메서드에서 선언한 Java 인수를 전달합니다. 예를 들어, 다음은 Java 문자열을 네이티브 문자열로 변환합니다: 스칼라 와 Java 예제 모두의 경우 네이티브 구현은 정확히 동일합니다. 코드는 다르지만 C 또는 C++에서 구현을 작성할 수 있습니다.

아래 샘플은 C++에서 Sample1.h에 정의된 모든 메서드를 구현합니다. 아래 코드를 복사하여 Sample1.cpp라는 파일에 붙여넣기: 참조 관리는 효율적인 프로그램을 작성하는 데 매우 중요합니다. 예를 들어 FindClass(), GetMethodID(), GetFieldID() 를 사용하여 네이티브 함수 내에서 jclass, jmethodID 및 jfieldID를 검색하는 경우가 많습니다. 반복 호출을 수행하는 대신 값을 한 번 가져오고 후속 사용을 위해 캐시하여 오버헤드를 제거해야 합니다. 컴파일우리는 이제 우리의 프로그램을 컴파일하고 실행할 준비가되어 있습니다. 컴파일은 시스템에 따라 다릅니다. 이렇게 하면 libHelloImpl.so 또는 HelloImpl.dll(O/S에 따라 다름)이 생성됩니다. 컴파일된 라이브러리가 저장되는 디렉터리를 가리키도록 LD_LIBRARY_PATH를 설정합니다. Java 응용 프로그램을 실행합니다. 예를 들어, Linux에서 Hello.c를 컴파일하려면 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 데이터 유형 매핑 그리고 당신은 libjnitests.so 파일이 빌드 디렉토리 아래에 반짝 이 나타납니다 볼 수 있습니다! 윈도우 사람에 대 한 그것은 libjnitests.dll 그리고 맥 OS 사람에 대 한 그것은 libjnitests.dylib, 하지만 그들은 정말 모두 동일. 다음은 java.lang.String 인스턴스를 구성하고 반환하는 또 다른 예입니다.

내 프로젝트가 JNI에 있기 때문에 뮤틀리 스레딩을 사용하여 더 많은 예제를 공유 할 수 있으므로 더 많은 도움이 필요합니다. 이전 예제를 기억 하는 경우, 우리는 „안녕하세요 이름“을 표시 하 고 싶 었 네이티브 메서드: 우리의 코드를 테스트 하려면, 우리는 이전 HelloWorld 예제의 모든 컴파일 단계를 반복 했습니다. 이는 대부분의 기본 형식이 JNI 헤더 파일에 의해 제공된다는 것을 보여주기 위한 것입니다. 예를 들어 부울은 jboolean으로 표시됩니다. 코드를 만드는 가장 좋은 방법은 IDE를 사용하거나 CTags를 사용하여 JNI 헤더 파일의 형식을 검사하는 것입니다.

Comments are closed.