b2Contact* b2Contact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator) { if (s_initialized == false) { InitializeRegisters(); s_initialized = true; } b2Shape::Type type1 = fixtureA->GetType(); b2Shape::Type type2 = fixtureB->GetType(); b2Assert(0 <= type1 && type1 < b2Shape::e_typeCount); b2Assert(0 <= type2 && type2 < b2Shape::e_typeCount); b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; if (createFcn) { if (s_registers[type1][type2].primary) { return createFcn(fixtureA, indexA, fixtureB, indexB, allocator); } else { return createFcn(fixtureB, indexB, fixtureA, indexA, allocator); } } else { return NULL; } }
int initApi(const char *driverLibName, const char *implLibName, T **dispatchTable, T *(*accessor)()) { void *driverLib = dlopen(driverLibName, RTLD_NOW | RTLD_LOCAL); if (driverLib == NULL) { ALOGE("failed to load %s : %s\n", driverLibName, dlerror()); return -1; } typedef T *(*createFcn_t)(void *, T *(*accessor)()); createFcn_t createFcn; createFcn = (createFcn_t) dlsym(driverLib, "createFromLib"); if (createFcn == NULL) { ALOGE("failed to load createFromLib constructor function\n"); return -1; } void *implLib = dlopen(implLibName, RTLD_NOW | RTLD_LOCAL); if (implLib == NULL) { ALOGE("couldn't open %s", implLibName); return -2; } *dispatchTable = createFcn(implLib, accessor); if (*dispatchTable == NULL) { return -3; } // XXX - we do close the impl library since it doesn't have data, as far as we concern. dlclose(implLib); // XXX - we do not dlclose the driver library, so its not initialized when // later loaded by android - is this required? ALOGD("loading %s into %s complete\n", implLibName, driverLibName); return 0; }