java code 에서 getPixels 를 이용해서 만든 int [ ] 를 native code에 전달해서 영상처리 한 후에,
그 변화된 것들을 java code 상에 있는 배열에 반영해서 출력하려고 합니다.
public native boolean MakeLabelTable(int data[ ]); 함수를 선언해서
native code에서
dest = (*env)->GetIntArrayElements(env, source, 0);
로 받아서 작업을 하고,
(*env)->ReleaseIntArrayElements(env, source, dest, JNI_COMMIT); 로 변화된 값을 원본 배열에 반영한 후에
JNI_COMMIT option은 dest 배열을 해제하지 않는 옵션이라고 했으니까
dest 배열에 있는 데이터로 나머지 처리 작업을 또 하다가, java code에서 보이고 싶은 것이 있을 때
ReleaseIntArrayElements 함수를 다시 호출해서 반영하려고 생각했습니다만,
C code에서 수정한 내용이 반영이 되다 말다 하더라구요;;
게다가 C code 상에서 dest [ i ] = 0xFF00FF00; 이런식으로 변경한 값이 ReleaseIntArrayElements 함수로
반영이 안되는 것 같기도 하구요.
검색을 좀 하다보니까
#include "HelloJNI.h"
#include <stdio.h>
JNIEXPORT jbyteArray JNICALL Java_HelloJNI_byteArrayTest
(JNIEnv *env, jobject jobj, jbyteArray jsrc) {
jbyteArray result;
jsize n = (*env)->GetArrayLength(env, jsrc);
jbyte *pbyte = (*env)->GetByteArrayElements(env,jsrc, 0);
int i = 0;
jbyte value;
result = (*env)->NewByteArray(env, 10);
for(i=0;i<n;i++) {
(*env)->GetByteArrayRegion(env, jsrc,i,1,&value);
printf("%d-->%d \n", i, value);
(*env)->SetByteArrayRegion(env, result, i, 1, &value);
}
/*혹은 다음과 같이 한꺼번에 배열원소를 초기화할 수 있다 */
(*env)->SetByteArrayRegion(env, result, 0, 10, pbyte);
(*env)->ReleaseByteArrayElements(env, jsrc, pbyte, 0);
return result;
}
이런 코드처럼 ReleaseByteArrary 함수도 쓰고, 배열을 return 도 하는 것으로 보아
Release 하는것과 return 하는 것의 차이가 있다고 생각되는데요, document 를 계속 읽어봐도 아리송하네요;;
JNI에서 배열을 전달받아서 수정한 값을 반영하는 올바른 방법이 어떤 것인지 좀 알려주세요. ㅠㅠ



