개발하는 두더지

[C/C++/JAVA/JNI] JNI로 DLL, so 만들어 JAVA 프로젝트에서 사용하기 본문

Java,Android

[C/C++/JAVA/JNI] JNI로 DLL, so 만들어 JAVA 프로젝트에서 사용하기

덜지 2016. 7. 28. 15:48

# 빌드환경

Windows 10 64 bit + Eclipse 64 bit + Mingw 32/64bit



# 동작과정


C Project 생성


File -> New -> Other or C Project 선택



MinGW를 설치하면 Executable -> Empty Project -> MinGW GCC가 생김

(MinGW는 별도로 검색해서 설치해야함. 32비트 64비트 Installer가 따로있음.)

Project name을 쓰고 Finish



MinGW GCC 환경 세팅 방법


Project Properties -> C/C++ Build -> Environment -> MINGW_HOME 을 32비트 경로 또는 64비트 경로로 변경

이 위치에따라 최종 아웃풋이 32비트 dll 또는 64비트 dll로 나온다.


글쓴이의 MINGW의 설치경로는 다음과 같다.

64비트 : C:\Program Files\mingw-w64\x86_64-6.1.0-win32-seh-rt_v5-rev0\mingw64

32비트 : C:\MinGW


#include <jni.h> 가 syntex 오류가 나온다면?!


JDK가 설치된 경로에서 include 와 include\win32 를 Add 해야한다.

jdk\include  :   #include <jni.h>  Syntex Error 안나옴

jdk\include\win32 :  JNIEXPORT jint  Syntex Error 안나옴




밑줄그어진대로 하면 Win32 API와 중복선언으로 인한 에러가 나오므로 JDK를 로드해야함

Project Properties -> C/C++ General -> Paths and Symbols -> includes -> GNU C 또는 GNU C++ -> include directories 를 NDK 설치경로안에 include 를 추가한다. 

(글쓴이는 Android 개발하면서 설치한 Android NDK 안에 있는 폴더를 사용함)

NDK : E:\ProgramFiles\android-ndk-r10d\platforms\android-21\arch-x86_64\usr\include



최종 결과물을 DLL로 뽑아쓰려면?!

Project Properties -> C/C++ Build -> Settings -> Build Artifact -> 아래와 같이 변경

Output prefix는 lib으로 되어있는데 빈공간으로 둔다.

빌드 후 아웃풋 파일



Java Project 생성


Native Call Class 생성

Execute Class 생성



Native Call Class 로 C Header 생성

cmd.exe 를 키고 자바 프로젝트 bin 폴더까지 들어간다.

그다음에 javah -jni 패키지명.클래스명 을 입력하고 엔터를 누르고 에러메세지가 뜨지 않았다면

자바 프로젝트 bin 폴더안에  패키지명_클래스명.h가 생성된다.


생성된 헤더파일을 C 프로젝트로 복사한다.


헤더파일을 켜보면 아래와 같이 자동 생성되있다.


C 파일 생성

패키지명_클래스명.c 파일을 생성하고

아래와 같이 입력한다.


C Project 를 빌드하면 아래와같이

NativeDLLSample.dll 64bit 가 생성된다.



DLL를 Java Project로 복사 후 코드를 몇개 추가하고 실행시키면 아래와 같은 결과물이 나온다.

















Comments