JAVA > Tip&Tech > JAVA C++참조
 
JAVA
Library
Tip&Tech
Q&A
java공식사이트
Java  Platform Standard Edition 6 의 API 스펙
Tip&Tech
  HOME > JAVA > Tip&Tech
 
작성일 : 10-05-04 00:04
JAVA C++참조
 글쓴이 : 덩벙이 (124.♡.90.117)
조회 : 5,358   추천 : 0   비추천 : 0  

1. 먼저 JAVA언어에서 C++언어게서 가져올 클래스를 만듭니다. 

  • 이것은 단순히 C++언어와의 소통을 주고 받을 인터페이스 클래스 입니다. < JAVA Interface는 아닙니다. >

  • 반드시 불러올 라이브러리는 Static으로 처리 해 주시기 바랍니다.

  • 만드시는 패키지로 해도 상관은 없습니다.

 

  1. /*
  2. jnitest.java 입니다. 
  3. TESTDLL 라이브러리를 받아 JAVA로 데이터를 연결하여 처리합니다. 
  4. */
  5. package kr.co.bond.jni;
  6. public class jnitest {
  7. static{
  8. System.loadLibrary("TESTDLL");
  9. }
  10. // TEST HELLO WORLD
  11. /**
  12. * C++ 에서 함수 호출 여부를 확인 하기 위한 테스트 
  13. */
  14. public native void printHelloWorld();
  15. /**
  16. * int 형 숫자를 전달하기 위한 테스트 함수 
  17. * @param arg1 인수 1 
  18. * @param arg2 인수 2
  19. * @return 인수를 더한 값 
  20. */
  21. public native int addINT( int arg1, int arg2);
  22. /**
  23. * double 형 데이터를 전달하기 위한 테스트 함수 
  24. * @param arg1 인수 1
  25. * @param arg2 인수 2
  26. * @return 인수를 더한 값
  27. */
  28. public native double addDBL( double arg1, double arg2);
  29. /**
  30. * 문자열 데이터를 전달하고 받는 것을 테스트 하기 위한 함수
  31. * 영문만 가능
  32. * @param str DLL로 전달될 문자열
  33. * @return DLL에서 JAVA로 전달된 문자열 데이터
  34. */
  35. public native String getStr( String str );
  36. }

 

2. 해더 파일 및 자바 클래스 파일을 생성합니다. 

  • 자바 컴파일을 수행합니다. 

    • 반드시 JDK에서 수행해야 합니다. 
  •  JNI를 위한 C++용 인터페이스 파일을 생성합니다. 즉 해더 파일(*.h)을 생성합니다. 

    • 해더 파일 생성시 자바 패키지 풀 이름을 적어 주셔야 합니다. 
    • 생성된 파일 명은 패키지명이 포함된 풀명에서 '.'대신 '_'로 치환 된 '*.h' 파일입니다. 

      • 예> kr.co.bond.jni.jnitest.java =생성=> kr_co_bond_jni_jnitest.h 

 

  1. #> javac ./kr/co/bond/jni/jnitest.java         <: JAVA Compile
  2. #> javah -jni kr.co.bond.jnitest               <: JAVA JNI 테스트       

 

3. C 파일을 작성합니다.

  •  반드시 2번에서 생성된 해더파일을 포함해야 하며. 해더 파일에서 선언된 함수를 수행하는 C++(또는 C)언어를 작성합니다.

 

  1. #include <jni.h>
  2. #include "kr_co_bond_jni_jnitest.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. // 한글 처리 관련 데이터
  6. #include "NativeStringUtil.h"
  7. JNIEXPORT void JNICALL Java_kr_co_bond_jni_jnitest_printHelloWorld (JNIEnv *, jobject)
  8. {
  9. printf( "Hello World \n" );
  10. return;
  11. }
  12. JNIEXPORT jint JNICALL Java_kr_co_bond_jni_jnitest_addINT (JNIEnv *env, 
  13. jobject obj, 
  14. jint arg1 , 
  15. jint arg2)
  16. {
  17. jint sum;
  18. sum = arg1 + arg2;
  19. printf( "%d+%d \n", arg1, arg2);
  20. return sum;
  21. }
  22. JNIEXPORT jdouble JNICALL Java_kr_co_bond_jni_jnitest_addDBL(JNIEnv *env, 
  23.  jobject, 
  24.  jdouble arg1, 
  25.  jdouble arg2)
  26. {
  27. jdouble sum;
  28. sum = arg1 + arg2;
  29. printf( "%.1f+%.1f \n", arg1, arg2);
  30. return sum;
  31. }
  32. JNIEXPORT jstring JNICALL Java_kr_co_bond_jni_jnitest_getStr(JNIEnv *env, jobject obj, jstring msg )
  33. {
  34. char buff[100] = "안녕";
  35. const char* str = env->GetStringUTFChars(msg, 0);
  36. printf( "RESULT = %s \n", str );
  37. (*env).ReleaseStringUTFChars( msg, str);
  38. return (*env).NewStringUTF( buff );
  39. return 0;
  40. }

     

 

4. C++ 언어로 작성된 것을 동적 라이브러리 파일로 생성해야 합니다. 

  • g++로 컴파일을 권장해 드립니다. <물론 다른 컴파일도 가능하나 cc, gcc로 할 경우 안되는 경우를 확인함
  • 명령어 설명

    • -shared 옵션을 반드시 주시기 바랍니다. 이것은 동적 라이브러리 만들기 위한 옵션입니다. 
    • -I$JDK_HOME/include -I$JDK_HOME/include/linux 는 JNI를 만들기 위해 반드시 링크를 해야 하는 부분입니다.

      • JDK_HOME의 경우는 JDK의 경로를 나타냅니다. 

        • -o 는 출력 파일 명을 나타냅니다. 주의할 점은 반드시 lib를 접미사로 붙여 주시기 바랍니다. 안할 경우 자바에서 인식을 못합니다. 

          • 예> Windows :: TESTDLL.dll == LInux :: libTESTDLL.so

 

  1. 라이브러리 패스 생성
  2. JDK_HOME=/usr/lib/j2se/
  3. export JDK_HOME

 

  1. 동적 라이브러리 파일(*so)생성
  2. #>g++ -shared -I$JDK_HOME/include -I$JDK_HOME/include/linux -o libTESTDLL.so TESTDLL.cpp

 

5. JAVA 라이브러리 패스를 지정합니다. 

  • 자바 라이브러리 패스를 지정합니다. 지정 변수는 LD_LIBRARY_PATH 입니다. 

    • 현재의 패스에 동적 라이브러리 파일(*so)이 있을 경우에는 `pwd` 를해서 지정해도 됩니다. 

 

  1. 라이브러리 패스 생성ㅊㅇ .
  2. LD_LIBRARY_PATH=/export/home/leedh/srv/
  3. export LD_LIBRARY_PATH

 

6. 자바를 실행 시킵니다. 

  • 자바에서 JNI을 통해 C++로 작성된 동적 라이브러리 파일(*.so)을 가져 오기 위한 프로그램을 작성후 컴파일 후에 실행 시키면 됩니다. 
  • 다음은 실행 후 결과 입니다. 

 

 

  1. [root@orabackup01 src]# /opt/SDK/jdk/bin/java MainTest
  2. =============================
  3. jni TEST                                 :JAVA
  4. Hello World                              :C++
  5. 10+5                                     :JAVA
  6. 15                                       :C++
  7. 10.5+5.5                                 :C++
  8. A + B =16.0                              :JAVA
  9. RESULT = TEST JNI                        : JAVA = C++
  10. =============================

 


 
 

Total 13
번호 제   목 글쓴이 날짜 추천 비추천 조회
13 [안드로이드 스튜디오] 퍼미션 부분 정리 덩벙이 09-08 0 0 101
12 콘솔에서 jar파일 만들기 덩벙이 09-05 0 0 97
11 아두이노(Arduino)와 자바(Java) 통신 RXTX 덩벙이 03-18 0 0 2223
10 진수변환 16진수를 10진수로 10진수를 16진수로 덩벙이 03-18 0 0 1592
9 java.util.Timer 를 사용하여 잡 스케줄링 하기 덩벙이 06-07 0 0 7394
8 JAVA C++참조 덩벙이 05-04 0 0 5359
7 java soap 사용하기 덩벙이 05-03 0 0 5299
6 java socket(소켓) 샘플코드 덩벙이 02-16 0 0 6189
5    java socket(소켓) 샘플코드 덩벙이 06-08 0 0 7515
4 자바관련 추천사이트 덩벙이 12-16 0 0 5128
3 java 인코딩 테스트를 한번에 (한글깨졌을때, 한글깨짐..) 덩벙이 08-19 0 0 13492
2 byte 단위로 문자열자르기1 덩벙이 07-13 0 0 10861
1 byte 단위로 문자열자르기 덩벙이 07-13 0 0 8246
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.