기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요. 요즘 camera쪽을 보고 있습니다.
궁금 한 것이
camera.java에서 생성자를 호출 할 때 native_setup 함수를 호출합니다.
native_setup(new WeakReference<Camera>(this), cameraId);
여기서 첫번째 인자는 native_setup을 호출한 인스턴스를 넘겨 줍니다.
JNI는 아래와 같습니다.
static void android_hardware_Camera_native_setup
(JNIEnv *env, jobject thiz, jobject weak_this, jint cameraId)
env는 JNI관련 함수를 사용할 수 있는 포인터,
thiz는 호출 한 쪽의 객체
weak_this는 첫번째인자입니다.
여기서 궁금한 것이 thiz랑 weak_this랑은 같은 것 아닌가요?
thiz는 jclass clazz = env->GetObjectClass(thiz); 로 객체를 받고 다음에서 인자로 넘어 갑니다.
sp<JNICameraContext> context = new JNICameraContext(env, weak_this, clazz, camera);
JNICameraContext에서도 weak_this와 clazz(thiz)를 구분해서 씁니다.
근데 보면은 env->CallStaticVoidMethod <=== 요놈을 호출 할 때 인자로 둘다 넘어 갑니다.
weakreference로 넘어가도 같은 클래스의 객체인데 왜 두개를 다 넘겨주는지도 잘 모르겠습니다. ㅠ.ㅠ
그리고 마지막으로 android_hardware_Camera_native_setup의 마지막 줄에
// save context in opaque field
env->SetIntField(thiz, fields.context, (int)context.get());
이렇게 되어 있는데, fields.context는 fields의 구조체인데 이건 android_hardware_Camera.cpp에 static로
정의가 되어 있습니다.
근데 env->SetIntField(thiz, fields.context, (int)context.get()); <== 요기서 thiz object에 fields.context에
(int)context.get()값을 저장하는 걸로 알고 있습니다. 여기서 thiz은 camera.java의 object인데 여긴 이러 field가
없습니다. 아~ 머리가 뽀게질려고 합니다 .ㅠㅠ