철이의 컴노리
  • 안녕하세요!
  • KOTLIN
  • ANDROID
    • Architecture Components
      • 프로젝트에 추가하기
      • 데이터 바인딩 라이브러리
        • 시작하기
        • 레이아웃 및 바인딩 표현식
      • 라이프 사이클 처리
      • ViewModel
    • CameraX
      • CameraX 아키텍처
      • 구성
      • 미리보기
      • 이미지 분석
      • 이미지 캡처
      • 제조 업체 확장 기능
    • View
      • 커스텀뷰의 크기 정하기
    • JNI 튜토리얼
      • 1장. 저자 소개
      • 2장. Hello JNI
      • 3장. 메서드 등록
      • 4장. int 데이터형 값 주고 받기
      • 5장. boolean 데이터형 값 주고 받기
      • 6장. double 데이터형 값 주고 받기
      • 7장. float 데이터형 값 주고 받기
      • 8장. long 데이터형 값 주고 받기
      • 9장. short 데이터형 값 주고 받기
      • 10장. char 데이터형 값 주고 받기
      • 11장. byte 데이터형 값 주고 받기
      • 12장. JNI에서 문자열 다루기 1/3
      • 13장. JNI에서 문자열 다루기 2/3
      • 14장. JNI에서 문자열 다루기 3/3
      • 15장. 레퍼런스 이해하기
      • 16장. 배열 다루기 1/4
      • 17장. 배열 다루기 2/4
      • 18장. 배열 다루기 3/4
      • 19장. 배열 다루기 4/4
      • 20장. 중간 요약
      • 21장. 자바 클래스 찾기 1/2
      • 22장. 자바 클래스 찾기 2/2
      • 23장. 정적 메서드 찾기
      • 24장. 정적필드 찾기
      • 25장. 자바 클래스 인스턴스 생성하기
      • 26장. 자바 클래스 인스턴스 메서드 찾기
      • 27장. 자바 클래스의 인스턴스 필드 찾기
      • 28장. 네이티브 쓰레드 실행하기
  • Swift
    • What' New
      • Swift 5.0
        • Result 타입
        • Raw 문자열
        • 커스텀 문자열 보간
    • Codable
      • 커스텀 타입 인코딩 및 디코딩
  • iOS
  • OpenGL
    • OpenGL Tutorial
      • 1장. 저자 소개
      • 2장. OpenGL 윈도우 프레임웍 만들기 1편
      • 3장. OpenGL 윈도우 프레임웍 만들기 2편
      • 4장. 점그리기
      • 5장. 선 그리기
      • 6장. 다각형 그리기
      • 7장. 색 표현하기
      • 8장. 3차원 폴리곤 그리기
      • 9장. 투영변환
      • 10장. 이동, 회전, 크기 변환
      • 11장. 빛, 재질 표현하기
      • 12장. 텍스춰매핑
    • OpenGL ES Tutorial for iOS
      • 1장. 저자 소개
      • 2장. 튜토리얼 소개
      • 3장. OpenGL|ES 개발 환경 만들기
      • 4장. 뷰 배경색상 변경하기
      • 5장. 투영에 대해서 1/2
      • 6장. 투영에 대해서 2/2
      • 7장. 선분 및 삼각형 그리기
      • 8장. 색상칠하기
      • 9장. 텍스춰맵핑
      • 10장. 종횡비
      • 11장. 텍스춰 UV좌표
      • 12장. 텍스춰매핑 파라미터
      • 13장. 깊이버퍼
      • 14장. 원근투영
  • ENV
    • oh-my-zsh
      • 특정 git 폴더에서 zsh 이 느려질 때
  • Ubuntu
    • UEFI USB
    • nvidia driver
    • /dev/kvm on Android Studio
    • install oracle-jdk8
  • chromium
    • javap
Powered by GitBook
On this page

Was this helpful?

  1. ANDROID
  2. JNI 튜토리얼

2장. Hello JNI

맥에서 Hello JNI!를 출력하는 Java 응용프로그램을 개발해 보자. 단 이 응용프로그램은 문자열을 출력하는 부분을 C++ 로 작성할 것이다.

네이티브 라이브러를 사용하는 Java 클래스 작성하기

$ vi HelloJNI.java
// 주의! 학습 편의를 위해서 패키지를 작성하지 않는다!

class HelloJNI {
    private native void print();
    public static void main(String[] args) {
        new HelloJNI().print();
    }
    static {
        System.loadLibrary("HelloJNI");
    }
}

java 코드 파일을 컴파일하여 class파일을 만든다.

$ javac HelloJNI.java

JNI C++ 파일을 만들기 위해서 javah를 이용해 C++ 헤더파일을 만든다.

$ javah -jni HelloJNI

만들어진 파일을 확인해 보자

$ cat HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

JNI 함수명과 인자타입 등은 관련 문서를 참고한다. Java_HelloJNI_print 함수를 작성한다.

$ vi HelloJNI.cpp
#include <jni.h>
#include <iostream>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_print
(
    JNIEnv  *env, 
    jobject  thiz
)
{
    std::cout << "Hello JNI!" << std::endl;
}

HelloJNI 네이티브 라이브러리를 만들기 위해서는 jni.h 파일의 위치를 알아야 한다. 맥에서는 아래의 위치에 있다.

$ ls /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/

컴파일해 보자

$ g++ "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" -c HelloJNI.cpp

컴파일하면 HelloJNI.o 파일이 생성된다. 이제 동적라이브러리를 생성한다. 라이브러리명은 반드시 lib으로 시작해야 하고 확장자는 jnilib 이여야 한다. 위 컴파일문에서 jni.h를 찾을 수 없다는 오류가 발생하면 jni.h 가 있는 곳을 찾아서 적어줘야 한다. 아래처럼 심볼링 링크를 직접 만들어서 사용해야 한다. 예를 들어 /System/Library/Java/JavaVirtualMachines/Headers 폴더를 만든 후 해당 폴더로 이동한 다음 아래의 명령어를 실행한다.

$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h jni.h
$ ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni_md.h jni_md.h
$ g++ -dynamiclib -o libhellojni.jnilib HelloJNI.o

실행한다

$ java HelloJNI
Hello JNI!

만약 아래와 같은 링크 오류가 발생하면 실행할 때 네이티브 라이브러리가 있는 위치를 설정해야 한다.

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloJNI in java.library.path
$ java -Djava.library.path="." HelloJNI
Previous1장. 저자 소개Next3장. 메서드 등록

Last updated 6 years ago

Was this helpful?