강좌 & 팁
JNI 를 통해 배열을 다루는 방법 중, 지난 강좌에 못 다룬 부분들에 대한 내용을 추가해 보겠습니다
JNI 에서는 c/c++ 레벨에서 java 배열을 생성하고, 값을 set 하는 함수를 제공하고 있습니다.
===== (5) 배열 다루기 2 =================================================================
1. 예제
MainStart.java
public class MainStart {
iArray = JniFunctions.makeIntArray(10);
System.out.println("Array len = " + iArray.length); |
JniFunctions.java
public class JniFunctions { public static native int[] makeIntArray(int len); } |
c/c++ 레벨에서 배열을 생성해서 반환하는 함수 : makeIntArray()
c/c++ 레벨에서 배열에 값을 설정하는 함수 : setIntArray()
JniFunctions.cpp
#include <jni.h>
#ifdef __cplusplus
ji_array = env->NewIntArray(arr_len);
JNIEXPORT jint JNICALL Java_JniFunctions_setIntArray
len = env->GetArrayLength(ji_array);
for(i=0; i<len; i++)
free(int_buf); return len;
#ifdef __cplusplus |
실행 및 결과
$ javac JniFunctions.java $ export LD_LIBRARY_PATH=./ |
2. 메모리 관리.
NewIntArray() 와 SetIntArrayRegion() 을 사용하면서 메모리 관리에 대한 의문이 들 수 밖에 없다.
java 의 가비지 콜렉터에게 맡기면 되는 것인지, c/c++ 레벨에서 free / release 를 해주어야 하는 것인지 정확히 구분하기 어렵다.
NewIntArray() 의 경우는 생성된 배열을 return 시켜 java 레벨로 올려주므로 별도의 release 는 필요없을 것으로 생각된다.
그러나 SetIntArrayRegion() 에서 argument 로 들어가는 jint * 는 c/c++ 에서만 사용하므로,
malloc 을 했다면 반드시 free 를 해주어야 할 것이다.
* JNI 가 정확한 자료나 책이 많지 않기때문에, 경험상 android source 에서 reference 를 구하는 것이 가장 좋다.
==================================================================================