PDK에서 Surface를 제어하는 예제를 가져다가 JNI를 통해 어플과 연동시키려고 했는데
JAVA Application과 연동하면 자꾸만 Permission 문제가 발생하였다.

W/ServiceManager(  577): Permission failure: android.permission.ACCESS_SURFACE_FLINGER from uid=10020 pid=735
E/SurfaceFlinger(  577): Permission Denial: can't access SurfaceFlinger pid=735, uid=10020

위와 같이 Surface를 생성하려니까 자꾸만 Permission Denial 이라는 메세지가 나와서 ServiceManager 쪽에서 Permission 체크하는 부분을 아예 없애버렸는데 없애니까 작동을 잘 하기는 했다.

하지만 이렇게하면 올바른 방법이 아니기 때문에 한참 삽질끝에 JAVA에서 Surface를 JNI를 통해 끌어내리고 그것을 이용해서 Surface를 잡고, 또 그것을 이용해서 ISurface를 얻는 방법으로 진행했다.

다음의 코드를 참조하면 된다.



안드로이드의 frameworks/base/include/ui/Surface.h에 보면 getISurface가 private로 지정되어 있어서 다른 곳에서 접근 할 수가 없다.

그래서 Surface에 접근하는 Camera나 MediaRecoder, MediaPlayer 등등은 자신의 클래스를 friend class로 등록함으로써 Surface에 접근한다.

그중에 Test라는 클래스가 있는데 이놈을 이용하여 Surface에 접근 가능하다.

frameworks/base/libs/surfaceflinger/tests/overlays/overlays.cpp

를 참고하면 된다. 


저작자 표시 비영리 변경 금지
신고
Posted by Real_G