오늘 포스팅은 Java JNI ( Java Native Interface) 입니다.


자바는 특정 운영체제에 종속되지 않도록, JVM이라는 가상머신 위에서 실행되게끔 만들어진 언어입니다.


운영체제에 맞는 JVM이 각기 존재하기 때문에, Java 개발자는 하나의 Java 파일만 만들면, 


운영체제 상관없이 원하는 결과물을 쉽게 얻을 수 있습니다.


하지만 단점도 있습니다.


그중 하나의 단점은 운영체제의 모든 기능을 JVM이 담지 못하는 것입니다.


따라서, 구현하고 싶은 몇몇 기능들은 Java 언어 자체로도 해결 안되는 경우가 존재합니다.



JNI (Java Native Interface) 란?


  위에서 언급한 Java언어 자체로도 해결 안되는 경우, 대처할 수 있는 방법중 하나입니다.


운영체제의 고유기능(Native)을 Java로 해결 하는 것이 아닌 운영체제가 구현된 언어 (보통 C, C++)로


운영체제의 고유기능을 만듭니다. 


JVM은 C,C++로 만들어진 고유기능 즉, 함수를 Java 메서드와 연결해줍니다.


그로인하여 Java 메서드를 호출 할 시, C나 C++로 작성된 함수가 실행 됩니다.




JNI를 구현하기 위해 필요한 것



  C, C++을 작성하기 위한 비쥬얼 스튜디오가 필요합니다. 저는 2015 Community 썼습니다.




Java 코드 작성하기.



  먼저 필요한 자바 코드를 작성합니다.


JNI 구현 예시로 쓸 2개의 메서드를 만듭니다. 


1개는 HelloWorld를 콘솔에 찍는 메서드, 다른 한개는 단순히 숫자 3을 가져오는 메서드를 만들 예정입니다.


코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class JNI {
    
    static {
        System.loadLibrary("JNI");
    }
    
    private native int getNumber();
    private native void printHelloWorld();
    
    public static void main(String[] args){
        JNI jni = new JNI();
        
    
        jni.printHelloWorld(); //JNI로 호출 한 HelloWorld!
        
        System.out.println(jni.getNumber()); //JNI로 호출 한 숫자 메서드
    }
}
cs


static 초기화 블럭으로, 추후에 만들 dll 파일을 불러야 하는게 특징입니다.


또한, native 메서드를 만드는 갯수는 상관 없지만, 구현부가 비어있습니다.


dll 파일에 존재할 실제 구현된 함수를 호출하기 위해 만든 껍데기 메서드 입니다.



Java 코드 파일 컴파일, 헤더파일 만들기



  Java 파일 컴파일은 이클립스 같은 툴에서 진행 해도 됩니다.


하지만 헤더파일은 터미널 환경에서 컴파일을 진행 해야합니다. 


이클립스가 제공해주는 Terminal 환경에서 해도 무방합니다. 


하지만 헤더파일 컴파일은 Path 설정등으로 인하여,


잘 안되는 경우가 있기 때문에 아래의 방법을 추천합니다.


먼저 이클립스에서 JNI클래스를 컴파일 합니다.


당연히 dll파일을 찾지 못한다고 오류가 뜹니다. 상관없구요.


그다음 이클립스 workspace로 찾아가셔서 프로젝트폴더 - bin폴더로 갑니다.


그곳에서 Shift + 마우스 오른쪽 클릭 후, 


명령창 여기에서 열기 or PowerShell 여기에서 열기를 누릅니다.


터미널이 뜨면, 그곳에 아래와 같이 입력합니다.


javah 패키지명.클래스명

저 같은 경우 패키지명이 jni 클래스명이 위 예시와 같이 JNI 이므로


javah jni.JNI


로 했습니다.


제대로 컴파일 됬다면, bin폴더 어딘가에


패키지명_클래스명.h 파일이 생깁니다.


그 파일을 잘 보관합니다.



Visual Studio에서 C, C++ 작성하기.




1. 프로젝트 만들기


  Visual Studio를 실행합니다. 


아래와 같이 새로운 프로젝트를 만들어줍니다.



위와 같이 빈 프로젝트로 만들어 줍니다. 추후 dll파일을 만들때, 프로젝트명 으로 dll파일의 이름이 되므로,


프로젝트명을 잘지어줍니다.


2. 헤더 파일 넣기



위와 같이 헤더파일 폴더에 앞서 만들었던 헤더파일을 넣어줍니다.


조심해야 할 건, 복붙으로 넣지말고, 헤더 파일 폴더에 오른쪽 버튼 눌러서 툴의 도움으로 추가를 해야합니다.


그래야, 코드상에서 참조 가능합니다.


3. 프로젝트 속성 변경.



솔루션 탐색기 안에서 프로젝트 속성으로 들어갑니다.


그 후 프로젝트 기본값 - 구성 형식을 동적 라이브러리(.dll)로 바꿔주시고


일반 - 대상 확장명 도 .dll로 바뀌었는지 확인 해주세요.



4. 외부 라이브러리 설정




추가 포함 디렉토리를 누른 후 아래와 같이 입력합니다.


중요한점은, 개인 컴퓨터에 깔린 jdk 버전이 다르기 때문에 jdk 폴더 명은 다를 수 있습니다.




5. 코드 작성


헤더 파일에 있는 함수정보를 복사해서 파라미터를 아래와 같이 맞춰줍니다. (JNIEnv *  => JNIEnv *env , jObject -> jObject)




컴파일 한 후, 컴파일 된 dll파일을 찾습니다. ( 출력창에 dll이 생성된 path가 나옵니다.)



Java 프로젝트에 dll파일을 넣고 컴파일 하기



  만든 dll파일을 Java프로젝트 폴더 바로 아래에 넣고 컴파일 합니다.


dll파일을 아무곳에나 넣어도 상관은 없지만 대신 path를 맞게 입력해줘야 합니다.


프로젝트 폴더 바로 아래에 넣을 시, path 필요없이 파일명만 입력해도 되므로, 프로젝트 폴더 바로아래에 넣었습니다.


넣고 컴파일 해보면 아래와 같이 잘 작동하는걸 볼 수 있습니다.




여기까지가 준비한 내용입니다.


추가적으로 궁금한 사항있으면 댓글 달아주세요.


감사합니다.

'Java' 카테고리의 다른 글

[Java] CheckedException vs UnCheckedException  (0) 2020.09.27
[Java] 파일 경로 처리하기.  (2) 2019.01.24
JAVA - [SWING] LinearLayout 사용하기.  (0) 2017.08.25
JAVA - DownCasting(다운캐스팅)  (24) 2016.08.27
JAVA - HashMap key 구하기.  (1) 2016.08.25

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee
  1. dg 2022.01.26 17:22

    5. 코드작성은 jni_JNI.h 파일을 수정하는건가요? 아니면 새로 만들어서 작성하는건가요

  2. dumbassmommoo 2022.02.10 19:53

    이용약관위배로 관리자 삭제된 댓글입니다.

+ Recent posts