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에서 배열을 전달받아서 수정한 값을 반영하는 올바른 방법이 어떤 것인지 좀 알려주세요. ㅠㅠ