GraphicBufferMapper registerBuffer failed -14 (Bad address)
W/GraphicBufferMapper( 636): registerBuffer(0x8b080ae8) failed -14 (Bad address)
strerrorの14がBad addressなので、
49 status_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle) 50 { 51 ATRACE_CALL(); 52 status_t err; 53 54 err = mAllocMod->registerBuffer(mAllocMod, handle); <=mAllocModは下記のクラス 55 56 ALOGW_IF(err, "registerBuffer(%p) failed %d (%s)", 57 handle, err, strerror(-err)); 58 return err; 59 } 60
36 class GraphicBufferMapper : public Singleton<GraphicBufferMapper> 37 { 38 public: 39 static inline GraphicBufferMapper& get() { return getInstance(); } 40 41 status_t registerBuffer(buffer_handle_t handle); 42 43 status_t unregisterBuffer(buffer_handle_t handle); 44 45 status_t lock(buffer_handle_t handle, 46 int usage, const Rect& bounds, void** vaddr); 47 48 status_t unlock(buffer_handle_t handle); 49 50 // dumps information about the mapping of this handle 51 void dump(buffer_handle_t handle); 52 53 private: 54 friend class Singleton<GraphicBufferMapper>; 55 GraphicBufferMapper(); 56 gralloc_module_t const *mAllocMod; <=== これ 57 };
118 typedef struct gralloc_module_t { 119 struct hw_module_t common; 136 int (*registerBuffer)(struct gralloc_module_t const* module, 137 buffer_handle_t handle); <= レジスタ関数へのポインタ 151 int (*unregisterBuffer)(struct gralloc_module_t const* module, 152 buffer_handle_t handle); <=アンレジスタ関数へのポインタ 185 int (*lock)(struct gralloc_module_t const* module, 186 buffer_handle_t handle, int usage, 187 int l, int t, int w, int h, 188 void** vaddr); <=ロック関数へのポインタ 196 int (*unlock)(struct gralloc_module_t const* module, 197 buffer_handle_t handle); <=アンロック関数へのポインタ 200 /* reserved for future use */ 201 int (*perform)(struct gralloc_module_t const* module, 202 int operation, ... ); 204 /* reserved for future use */ 205 void* reserved_proc[7]; 206 } gralloc_module_t;
じゃあ、どこで関数を登録するんだろ?
もう、ハードウェアのドライバを呼ぶのかな。
38 GraphicBufferMapper::GraphicBufferMapper() 39 : mAllocMod(0) 40 { 41 hw_module_t const* module; 42 int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); 43 ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 44 if (err == 0) { 45 mAllocMod = (gralloc_module_t const *)module; <=ここで、関数へのポインタごともらうのかな? 46 } 47 }
FrameBufferのときは、こっちなのかな。
78 struct private_module_t HAL_MODULE_INFO_SYM = { 79 base: { 80 common: { 81 tag: HARDWARE_MODULE_TAG, 82 version_major: 1, 83 version_minor: 0, 84 id: GRALLOC_HARDWARE_MODULE_ID, 85 name: "Graphics Memory Allocator Module", 86 author: "The Android Open Source Project", 87 methods: &gralloc_module_methods 88 }, 89 registerBuffer: gralloc_register_buffer, <= 登録 90 unregisterBuffer: gralloc_unregister_buffer, <= 91 lock: gralloc_lock, <= 92 unlock: gralloc_unlock, <= 93 }, 94 framebuffer: 0, 95 flags: 0, 96 numBuffers: 0, 97 bufferMask: 0, 98 lock: PTHREAD_MUTEX_INITIALIZER, 99 currentBuffer: 0, 100 };
14:Bad address
gralloc_module_t const *mAllocMod;
110 typedef struct gralloc_module_t {