마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

JNI 구조체 리턴하는 방법 질문드립니다.

0 추천
안녕하세요.

현재

typedef struct AAM_POINT_2D_int {
 int x;
 int y;
} AAM_POINT_2D_int;

라는 구조체가 있고

AAM_POINT_2D * p2DNoRigid = NULL; 의 형태로 정의되어있습니다.

 

이 p2DNoRigid는 어떠한 함수를 거쳐 x 와 y에 1프레임당 121개의 값을 가지게 됩니다.

 

이걸 자바로 리턴시키려하는데 처음에 jfloatArray를 만들어서

    for(int i=0;i<121; i++)
       {
        getpointx[i] = (float)p2DNoRigid[i].x;

        getpointy[i] = (float)p2DNoRigid[i].y;
       }

 

이런식으로 뽑아줄려고했는데 안되더라구요. 구조체는 리턴시키는 다른 방법이 있나요?
심슨사랑 (690 포인트) 님이 2015년 9월 3일 질문

1개의 답변

+1 추천

대략 아래와 같습니다.

1. jfloatArray 생성

jfloatArray javaArrayX  = (*env)->NewFloatArray(env, "할당할 어레이 사이즈");

 

2. jfloatArray 에서 C에서 핸들링할 버퍼 포인트 받아옴 
jfloat *x_point = (*env)->GetFloatArrayElements(env, javaArrayX, 0);

 

3. c_point에 값 채움

    for(int i=0;i<121; i++)

 x_point[i] = (float)p2DNoRigid[i].x;

 

4. c에서 핸들링하던 버퍼 포인트 제거

(*env)->ReleaseFloatArrayElements(env, javaArrayX,  x_point, 0);

 

5. 구한 값 java로 반환 

return javaArrayX;

익명사용자 님이 2015년 9월 3일 답변
정말 감사합니다. 해결이 눈앞에 보입니다. 제가 지금 JNI가 처음이고 C를 안배운지라 막막해서 하나만 더 여쭙겠습니다.
말씀하신 코드는 JNIEXPORT로 자바로 뽑아내기위한 함수의 코드를 알려주신것 같아 그대로 실행하였습니다.

이렇게 준비된 JNIEXPORT를 A함수라 치면, p2DNoRigid에 값을 넣어주는것은
또다른 JNIEXPORT함수인 B입니다.

p2DNoRigid는 전역변수로 되어있으며 선언할때는 초기화 null을 집어넣으니 B에 set을 해주지않고 A함수만 빼면 결과가 당연히 NULL값이 나오기 때문에 set을 해주기 위하여

 jfloatArray javaArrayX를 전역으로 지정, 알려주신 1~4번의 과정은

B함수에 넣고 5번 리턴은 A함수에서 리턴만 시켜주었습니다.

B함수가 실행된 이후에 A함수가 실행되기 때문에 문제가 없을것이라 판단

중입니다만 역시 NULL이 출력됩니다. 새로운것을 시도하려다보니

전역 지역변수를 착각하고 있는것인지, 아니면 JNI에서 무언가를 안해준것인지

잘 모르겠습니다. 혹 조언해주실 것이 있다면 알려주심 감사하겠습니다.
...