보통은 사용자 마다 (리눅스의 User)

.bash_profile 등의 사용자 초기 실행설정에서 

JDK_HOME 이라던가, PATH 등을 정의한다.


 그런데, 한 사용자가 JDK 1.7에서만 돌아가는 프로그램과 JDK 1.8에서만 돌아가는 프로그램 두개를 동시에 돌리게 된다면 어떻게 될까?

둘 중 하나는 지원되지 않는 버전일테고, 그 지원되지 않는 버전일 경우 오류가 발생한다.(UnsupportedClassVersionError)


 이를 해결하기 위해서는 각 프로그램은 각각 다른 패스를 바라볼 필요가 있다.

즉, 패스 관리를 프로그램 별로 하는 것이다.

만약 Java 1.7, Mysql 4.8 기반의 프로그램 이라면 리눅스의 PATH 변수에 두 실행파일의 경로를 넣어주면 되는것이다.


위 내용을 스크립트로 관리하는 것이 아래 내용이다.



 


아래는 Bitnami 의 Redmine Stacks 에서 실제 사용하는 방법이다.


1. 다음과 같은 파일을 만들어서 PATH 부분에 실행할 경로를 넣는다.  (Bitnami Redmine Stack 의 use_Redmine 파일을 참조하였다.)

#use_Redmine 파일

#!/bin/sh

 

PATH="/home/nanum/BitnamiRedmineStack2.5.2/perl/bin:/home/nanum/BitnamiRedmineStack2.5.2/sqlite/bin:/home/nanum/BitnamiRedmineStack2.5.2/ruby/bin:/home/nanum/BitnamiRedmineStack2.5.2/subversion/bin:/home/nanum/BitnamiRedmineStack2.5.2/postgresql/bin:/home/nanum/BitnamiRedmineStack2.5.2/php/bin:/home/nanum/BitnamiRedmineStack2.5.2/mysql/bin:/home/nanum/BitnamiRedmineStack2.5.2/apache2/bin:/home/nanum/BitnamiRedmineStack2.5.2/common/bin:$PATH"

 

exec /bin/bash --noprofile --norc

 

만약 리눅스에 설치되어 있는 기본 JDK 가 1.5인데 1.6 버전을 쓰고싶다면 

PATH="jdk 경로:$PATH" 를 넣어주면 된다.

 

2.  ./"파일이름" 으로 실행하면 쉘이 바로 실행되는데 이 쉘 안에서 실행하고 싶은 프로그램을 돌리면 된다.


   * export PATH=~~~ 가 아닌 PATH=~~~~ 로 되어있다는 것을 알아둬야한다.

     export 명령어를 안썻으니 위의 PATH는 일회용인 것이다.



ex)

./use_Redmine

./redmineCtrl start


 

 

위 방법을 사용하게 된 계기

Jenkins 를 리눅스에서 실행하는데 버전이 낮아서 오류가 났다.

 

 root 의 암호조차 모르던 상태였기 때문에 위 방법을 사용하여 해결하게 되었다.

 

물론 path를 export 한 뒤에 입력해도 된다. 하지만 위 방법이 더 안정성 있다고 생각되고

 

불필요한 작업을 줄인다고 생각하기에 사용하게 되었다.

 

<파일 내용>

#java1.6.sh

#!bin/sh

PATH="/home/alm/jdk1.6.0_45/bin:$PATH"

exec /bin/bash --noprofile --norc


실행 : ./java1.6.sh

  ./Jenkins.jar



 



많고 많은 라이브러리 중 하나.
보통은 json-simple 을 사용하는 것으로 알고 있다.

Json 오브젝트에서 Key의 메타 데이터를 가져올 수 있는 라이브러리가 있는지 확인하는 과정에서 나온 라이브러리. 원하는 건 못찾았다.


          try {
               JSONObject jObject = new JSONObject(jString);

               // menu jsonobject 생성
               JSONObject responseObject = jObject.getJSONObject("response");

              
               JSONObject header = responseObject.getJSONObject("header");
               System.out.println(header.toString());
              
               String resultMsg = header.getString("resultMsg");
               System.out.println(resultMsg);
               String resultCode = header.getString("resultCode");
               System.out.println(resultCode);

              
               JSONObject body = jObject.getJSONObject("response").getJSONObject("body");

               JSONArray item = body.getJSONObject("items").getJSONArray("item");
              
               for(int i=0; i<item.length(); i++){
                    JSONObject item_o =item.getJSONObject(i);
                    System.out.println(item_o.toString());
                   
                    int rnum = item_o.getInt("rnum");
                    System.out.println(rnum);
                    int code = item_o.getInt("code");
                    System.out.println(code);
                    String name = item_o.getString("name");
                    System.out.println(name);
                   
                    /*String rnum = item.getJSONObject(i).getString("rnum");
                    System.out.println(rnum);
                    String code = item.getJSONObject(i).getString("code");
                    System.out.println(code);
                    String name = item.getJSONObject(i).getString("name");
                    System.out.println(name);*/
               }
               int numOfRows = body.getInt("numOfRows");
               System.out.println(numOfRows);
               int pageNo = body.getInt("pageNo");
               System.out.println(pageNo);
               int totalCount = body.getInt("totalCount");
               System.out.println(totalCount);
              
    

          } catch (JSONException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
          }


JNI 패키지 컴파일 예제



 본 예제는 JNI 를 사용하였을 때 패키지에서의 컴파일 방법을 설명한 예제이다.

참조 : http://lng1982.tistory.com/153 패키지 컴파일 방법.
참조 : http://buedt.tistory.com/50  패키지 안에서 JNI 활용하기 (일반 방법하고 다르다.)

  * 소스 작성 : ~/simple-test/HelloJni

com.HelloWorld.java   -> com 폴더 안에 HelloWorld.java  JNI 모듈이다.
package com;

public class HelloWorld {
public HelloWorld (){
System.loadLibrary("HelloWorld");
}
public native void printHelloWorld();
}
  
com.main.java   -> com 폴더 안에 main.java    JNI 모듈을 사용할 메인 함수이다.
package com;

public class main {
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
hw.printHelloWorld();
}
}

  
  

  JNI 모듈을 헤더파일로 변경

javac ./com/HelloWorld.java
javah -cp ./ com.HelloWorld



  * javah 로 작성된 com_HelloWorld.h

com_HelloWorld.h    -> 요거는 com 폴더 안에 있는 것이 아니라 컴파일 루트에 있다.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_HelloWorld */

#ifndef _Included_com_HelloWorld
#define _Included_com_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_HelloWorld
* Method: printHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_HelloWorld_printHelloWorld
(JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

  * com_HelloWorld.h 에 맞춰서 작성한 .cpp 클래스

HelloWorld.cpp  -> vi HelloWorld.cpp 로 com 폴더 밖에서 작성.
#include <stdio.h>
#include "com_HelloWorld.h"

JNIEXPORT void JNICALL Java_com_HelloWorld_printHelloWorld
(JNIEnv *env, jobject obj){
printf("hi World \n");
return;
}

  동적 라이브러리 생성
gcc -fPIC -g -c -Wall -I /usr/lib/jvm/java-7-openjdk-amd64/include HelloWorld.cpp
gcc -shared -o libHelloWorld.so.1.0.1 HelloWorld.o -lc
ln -s libHelloWorld.so.1.0.1 libHelloWorld.so

  자바 컴파일 및 실행
javac -d . com/*.java
java -cp . com.main


  실행 모습









* 메모리 누수 관련 내용 추가


.cpp 파일에서 jstring param 의 데이터를 쓰고 난 뒤에는

반드시 Release를 해주어야 한다.

이는 jstring 객체 뿐만 아니라 다른  jobject 들도 마찬가지이다.

안 그러면 메모리 누수가 발생한다.



아래는 올바른 예제. 붉은색 글씨가 Get 하고 Release 하는 부분이다.


#include <jni.h>

#include "MessageType.h"

#include <stdio.h>

JNIEXPORT jstring JNICALL Java_MessageType_printMessage(JNIEnv* env, jobject obj, jstring msg) {

   char buf[128];

   const char *str = (*env)->GetStringUTFChars(env, msg, 0);

   printf("%s", str);

   (*env)->ReleaseStringUTFChars(env, msg, str);

   scanf("%s", buf);

   return (*env)->NewStringUTF(env, buf);

} 



출처 : https://rerethink.tistory.com/entry/jni%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%A0%84%EB%8B%AC-%EC%9D%B8%EC%9E%90



'프로그래밍 > JAVA' 카테고리의 다른 글

JDK 버전 충돌이 날 경우 해결 방법  (1) 2016.02.12
Json Parser 라이브러리  (0) 2016.02.12

+ Recent posts