diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp index b0c894472..e5bd4a394 100644 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp +++ b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsGhostObject.cpp @@ -183,8 +183,9 @@ extern "C" { { btCollisionObject *co1 = (btCollisionObject *)pair.m_pProxy0->m_clientObject; jmeUserPointer *up1 = (jmeUserPointer*)co1 -> getUserPointer(); - - m_env->CallVoidMethod(m_object, jmeClasses::PhysicsGhostObject_addOverlappingObject, up1->javaCollisionObject); + jobject javaCollisionObject1 = m_env->NewLocalRef(up1->javaCollisionObject); + m_env->CallVoidMethod(m_object, jmeClasses::PhysicsGhostObject_addOverlappingObject, javaCollisionObject1); + m_env->DeleteLocalRef(javaCollisionObject1); if (m_env->ExceptionCheck()) { m_env->Throw(m_env->ExceptionOccurred()); return false; diff --git a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp b/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp index 31a29b7a0..cbb95faa2 100644 --- a/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp +++ b/engine/src/bullet/native/com_jme3_bullet_util_DebugShapeFactory.cpp @@ -90,8 +90,6 @@ extern "C" { (JNIEnv *env, jclass clazz, jlong shapeId, jobject callback) { btCollisionShape* shape = (btCollisionShape*) shapeId; if (shape->isConcave()) { - fprintf(stdout,"Concave shape"); - fflush(stdout); btConcaveShape* concave = (btConcaveShape*) shape; DebugCallback* clb = new DebugCallback(env, callback); btVector3 min = btVector3(-1e30, -1e30, -1e30); @@ -99,8 +97,6 @@ extern "C" { concave->processAllTriangles(clb, min, max); delete(clb); } else if (shape->isConvex()) { - fprintf(stdout,"Convex shape"); - fflush(stdout); btConvexShape* convexShape = (btConvexShape*) shape; // Check there is a hull shape to render if (convexShape->getUserPointer() == NULL) { diff --git a/engine/src/bullet/native/jmeClasses.cpp b/engine/src/bullet/native/jmeClasses.cpp index 254ef9d81..0d788e1e9 100644 --- a/engine/src/bullet/native/jmeClasses.cpp +++ b/engine/src/bullet/native/jmeClasses.cpp @@ -30,6 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "jmeClasses.h" +#include /** * Author: Normen Hansen diff --git a/engine/src/bullet/native/jmePhysicsSpace.cpp b/engine/src/bullet/native/jmePhysicsSpace.cpp index e3e566d4c..81c481f70 100644 --- a/engine/src/bullet/native/jmePhysicsSpace.cpp +++ b/engine/src/bullet/native/jmePhysicsSpace.cpp @@ -52,7 +52,7 @@ void jmePhysicsSpace::attachThread() { #ifdef JNI_VERSION_1_2 vm->AttachCurrentThread((void**) &env, NULL); #else - vm->AttachCurrentThread(vm, &env, NULL); + vm->AttachCurrentThread(&env, NULL); #endif } @@ -208,20 +208,28 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, void jmePhysicsSpace::preTickCallback(btDynamicsWorld *world, btScalar timeStep) { jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); JNIEnv* env = dynamicsWorld->getEnv(); - env->CallVoidMethod(dynamicsWorld->getJavaPhysicsSpace(), jmeClasses::PhysicsSpace_preTick, timeStep); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; + jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); + if (javaPhysicsSpace != NULL) { + env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_preTick, timeStep); + env->DeleteLocalRef(javaPhysicsSpace); + if (env->ExceptionCheck()) { + env->Throw(env->ExceptionOccurred()); + return; + } } } void jmePhysicsSpace::postTickCallback(btDynamicsWorld *world, btScalar timeStep) { jmePhysicsSpace* dynamicsWorld = (jmePhysicsSpace*) world->getWorldUserInfo(); JNIEnv* env = dynamicsWorld->getEnv(); - env->CallVoidMethod(dynamicsWorld->getJavaPhysicsSpace(), jmeClasses::PhysicsSpace_postTick, timeStep); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return; + jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); + if (javaPhysicsSpace != NULL) { + env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_postTick, timeStep); + env->DeleteLocalRef(javaPhysicsSpace); + if (env->ExceptionCheck()) { + env->Throw(env->ExceptionOccurred()); + return; + } } } @@ -235,10 +243,18 @@ bool jmePhysicsSpace::contactProcessedCallback(btManifoldPoint &cp, void *body0, jmePhysicsSpace *dynamicsWorld = up0->space; if (dynamicsWorld != NULL) { JNIEnv* env = dynamicsWorld->getEnv(); - env->CallVoidMethod(dynamicsWorld->getJavaPhysicsSpace(), jmeClasses::PhysicsSpace_addCollisionEvent, up0->javaCollisionObject, up1->javaCollisionObject, (jlong) & cp); - if (env->ExceptionCheck()) { - env->Throw(env->ExceptionOccurred()); - return true; + jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); + if (javaPhysicsSpace != NULL) { + jobject javaCollisionObject0 = env->NewLocalRef(up0->javaCollisionObject); + jobject javaCollisionObject1 = env->NewLocalRef(up1->javaCollisionObject); + env->CallVoidMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_addCollisionEvent, javaCollisionObject0, javaCollisionObject1, (jlong) & cp); + env->DeleteLocalRef(javaPhysicsSpace); + env->DeleteLocalRef(javaCollisionObject0); + env->DeleteLocalRef(javaCollisionObject1); + if (env->ExceptionCheck()) { + env->Throw(env->ExceptionOccurred()); + return true; + } } } }