[자바] JNI에서 jboolean을 bool로 바꾸기


자바에서 JNI를 사용하다 보면 인자로 받은 jboolean을 bool형으로 바꾸어야 할 일이 생깁니다.

그럴 때에는 아래 코드와 같이 하면 됩니다.

JNI_FALSE와 다른지를 검사하는 것이 JNI_TRUE와 같은지를 검사하는 것보다 좀 더 안전합니다.


jboolean foo;

bool bar;


// foo가 JNI_FALSE와 다른지를 검사하기 때문에 foo와 bar이 같은 논리값을 갖게 됩니다.

bar = (bool) (foo != JNI_FALSE);


( 참조한 곳: https://stackoverflow.com/a/10192690/1125721 )

[자바] 밑줄 (_) 이 들어가는 JNI 함수명


JNI에서는 함수명에 자바의 패키지 경로를 모두 쓰게 되는데, 그 때에 .(점)을 _(밑줄)로 치환하게 됩니다. 따라서 자바 함수명 자체에 밑줄이 있으면 문제가 생깁니다. 이런 경우 자바 함수명에 있는 밑줄은 JNI에서 _1로 치환하면 됩니다. 아래는 간단한 예제입니다.


// 자바

package com.tistory.crmn;

public class Hello {

    static native int get_hello();

}



// JNI

extern "C" JNIEXPORT jint JNICALL

Java_com_tistory_crmn_Hello_get_1hello(JNIEnv* env, jobject thiz) { // get_1hello에 주목하세요

    return (jint) 1;

}


[자바] 배열 내용 출력하기 (Arrays.toString())


자바에서 배열 내용을 출력해보려고 배열 자체에서 toString()을 사용하면 배열의 내용이 아니라 배열의 주소값이 출력됩니다. 배열의 내용을 출력하려면 Arrays.toString()을 사용해야 합니다. 예제 코드는 아래와 같습니다.


double[] values = {1.0, 1.1, 1.2};

System.out.println(values.toString()); // 이렇게 하면 [D@46a49e6 같은 값이 나옵니다.

System.out.println(Arrays.toString(values)); // 이렇게 하면 [1.0, 1.1, 1.2] 이 출력됩니다.


[자바] JNI 시그니처 (Signiture)


JNI 작업을 엄청 하다가 갑자기 정리해놓고 싶어서 씁니다.

https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html 에 있는 내용을 번역했습니다.


타입 시그니처


Z : 부울 값

B : 바이트

C : 문자

S : 쇼트 정수

I : 인트 정수

J : 롱 정수

F : 플로트 실수

D : 더블 실수

L : 클래스-전체-경로 ; 클래스

[ : 배열

( 인자들 ) 반환형 : 함수


예를 들어 다음의 자바 함수를 생각해 보겠습니다.


long f (int n, String s, int[] arr); 


이 함수의 시그니처는 다음과 같습니다.


(ILjava/lang/String;[I)J


---

(제가 추가한 내용)

I는 정수 n, Ljava/lang/String;은 문자열 s, [I는 정수 배열 arr이고 J는 반환값 long을 뜻합니다.


[자바] 코드 실행 시간 측정하기 (System.currentTimeMillis())


프로그래밍을 하다 보면 코드 특정 부분의 실행 시간을 측정해야 하는 경우가 생깁니다.

그럴 때에 아래와 같이 System.currentTimeMillis() 함수를 사용하면 밀리초 단위로 시간을 잴 수 있습니다.

System.currentTimeMillis() 의 반환 변수 형식은 long 입니다.


long 시작시간 = System.currentTimeMillis();

// 여기서 원하는 작업을 해 줍니다.

long 끝시간 = System.currentTimeMillis();

long 걸린시간 = 끝시간 - 시작시간;

System.out.println("걸린 시간: " + 걸린시간 + " 밀리초");


[자바] 제곱 속도 - 직접 만든 제곱 함수가 Math.pow() 보다 빠를 때도 있어요


* 1.0의 제곱을 20억 번 할 경우 Math.pow()가 직접 만든 제곱 함수보다 세 배 느렸습니다.


* 제곱 횟수를 훨씬 늘리면 시간 차이가 줄어들던데, 아마 JIT 컴파일 때문이 아닐까 추측만 해 보았습니다.


* 실험 결과와 코드는 아래와 같습니다.





걸린 시간 (Math.pow 함수, 20억 회): 6 ms

걸린 시간 (직접 만든 제곱, 20억 회): 2 ms




public class 제곱속도측정 {


  public static double 직접만든제곱(double 숫자) {

    return 숫자*숫자;

  }


  public static void main(String[] args) {

    long 시작시간1 = System.currentTimeMillis();

    for(int i=0; i<2000000000; ++i) {

      Math.pow(1.0, 2);

    }

    long 끝시간1 = System.currentTimeMillis();

    System.out.println("걸린 시간 (Math.pow 함수, 20억 회): " + (끝시간1-시작시간1) + " ms");


    long 시작시간2 = System.currentTimeMillis();

    for(int i=0; i<2000000000; ++i) {

      직접만든제곱(1.0);

    }

    long 끝시간2 = System.currentTimeMillis();

    System.out.println("걸린 시간 (직접 만든 제곱, 20억 회): " + (끝시간2-시작시간2) + " ms");

  }


}







  1. 지나가는개발자 2020.02.04 23:37

    Math.pow()의 함수를 까보면 왜 느린지 이해가 가실겁니다.
    단순히 숫자*숫자를 하는게 아니라 그렇습니다.

    • 크롬망간 2020.02.04 23:44 신고

      감사합니다~ 어떻게 구현되어있는지 보면 재미있겠네요 ㅋ

+ Recent posts