Box2d removeJoint致命信号11(SIGSEGV)

时间:2014-08-13 14:23:18

标签: android box2d andengine sigsegv jbox2d

我尝试删除mouseJoint时出现致命信号11(SIGSEGV)错误。我的代码基于此AndEngine PhysicsMouseJointExample

//physicWorld onUpdate
@Override
public void onUpdate(float pSecondsElapsed) {
    if (removeMouseJoint) {
        destroyMouseJoint();
        removeMouseJoint = false;
    }

    for (Body body : elementsToBeDestroyed) {
        destroyBody(body, elementsMap.remove(body).getKey());
        checkForMouseJoint(body);
    }
    elementsToBeDestroyed.clear();
}

private void destroyBody(final Body body, final IShape mask) {
    if (physicsWorld != null) {
        physicsWorld.unregisterPhysicsConnector(physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(mask));
        physicsWorld.destroyBody(body);
    }
}

private void checkForMouseJoint(Body body) {
    if (mouseJointActive != null && mouseJointActive.getBodyB() != null && mouseJointActive.getBodyB().equals(body)) {
        destroyMouseJoint();
    }
}

private void destroyMouseJoint() {
    if (mouseJointActive != null && mouseJointActive.getBodyB() != null) {
        Log.i(C.TAG, "destroyMouseJoint from " + mouseJointActive.getBodyB().getUserData());
        physicsWorld.destroyJoint(mouseJointActive);
    }
    mouseJointActive = null;
}

@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
    switch (pSceneTouchEvent.getAction()) {
        case TouchEvent.ACTION_UP:
            if (sceneTouchId == pSceneTouchEvent.getPointerID()) {
                sceneTouchId = -1;
                // destroyMouseJoint();
                removeMouseJoint = true;
            }
        return true;
        }
    …
    return false;
}


它随机崩溃,我的Log.i()表明destroyJoint存在问题:

08-13 14:56:18.465 ...我/ [记录器]来自bodyColorGreen的destroyMouseJoint
08-13 14:56:18.970 ... A / libc:致命信号11(SIGSEGV)位于0xbf800008(代码= 1),线程23033(UpdateThread)

我该如何解决这个问题? 谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

我发现了问题!由于我禁用了冲突并删除了主体,因此我遇到了并发问题。我使用ReentrantLock修复了这种情况,所有方法都操纵了主体添加/删除/碰撞/等....工作得很好,没有更多的SIGSEGV。