JNIEXPORT
jboolean
JNICALL
Java_org_gearvrf_bullet_Bullet_destroyPhysicsWorld(JNIEnv* env,
                                                  jobject thiz,
                                                  jlong physicsWorldId) {

	LOGV("in Java_org_gearvrf_bullet_Bullet_destroyPhysicsWorld.");

	btDynamicsWorld* pDynamicsWorld = g_DynamicsWorlds.get(physicsWorldId);
	if(pDynamicsWorld == NULL) {
		LOGV("Don't Load pDynamicsWorld.");
		return JNI_TRUE;
	}
	
	destroyPhysicsWorld(pDynamicsWorld);
	
    return  JNI_TRUE;
}
void AWPhysics::PhysicsManager::initPhysicsWorld()
{
    // This leaks if called twice in a row. Therefore destroy first always:
    destroyPhysicsWorld();

    mLogger << "creating physics world";
    ///collision configuration contains default setup for memory, collision setup
    m_collisionConfiguration = new btDefaultCollisionConfiguration();
    //m_collisionConfiguration->setConvexConvexMultipointIterations();

    ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
    m_dispatcher = new	btCollisionDispatcher(m_collisionConfiguration);

    m_broadphase = new btDbvtBroadphase();

    ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
    btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver;
    m_solver = sol;

    m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration);

    m_dynamicsWorld->setGravity(btVector3(0, -10, 0));
    mLogger << "finished creating physics world";
}
JNIEXPORT
jboolean
JNICALL
Java_org_gearvrf_bullet_Bullet_destroyNative(JNIEnv* env,
                                            jobject thiz) {

	LOGV("in Java_org_gearvrf_bullet_Bullet_destroyNative.");
	
	// delete DynamicsWorld.
	for( signed int i = 0; i < g_DynamicsWorlds.size(); i++ ) {
		btDynamicsWorld* pDynamicsWorld = g_DynamicsWorlds[i];
		destroyPhysicsWorld(pDynamicsWorld);
	}

	// delete Collisions.
	for( signed int i = 0; i < g_CollisionShapes.size(); i++ ) {
		btCollisionShape* shape = g_CollisionShapes[i];
		g_CollisionShapes[i] = 0;
		SAFE_DELETE( shape );
	}
	
	return JNI_TRUE;

}
AWPhysics::PhysicsManager::~PhysicsManager()
{
    destroyPhysicsWorld();
    mLogger << "PhysicsManager destroyed";
}