Swig java界面垃圾收集器

时间:2014-10-02 02:09:02

标签: java c++ interface garbage-collection swig

我正在尝试使用swig生成java接口。除了在线程的每个循环中快速调用接口之外,它工作正常。这导致java垃圾收集器继续过驱动,因为当调用接口时,它为每个虚拟函数分配一个新对象。参数对象。例如,在虚拟BeginContact方法中(如下所示),参数为b2Contact contact。每次调用接口时,swig生成的jni都会在java中创建一个新的Contact对象。这里是否有任何选项可以减轻java内存分配?

class b2ContactListener
{
public:
    virtual ~b2ContactListener() {}
    virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); }
    virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); }
    virtual void BeginContact(b2ParticleSystem* particleSystem,
                              b2ParticleBodyContact* particleBodyContact)
    {
        B2_NOT_USED(particleSystem);
        B2_NOT_USED(particleBodyContact);
    }

    /// Called when a fixture and particle stop touching if the
    /// b2_fixtureContactFilterParticle flag is set on the particle.
    virtual void EndContact(b2Fixture* fixture,
                            b2ParticleSystem* particleSystem, int32 index)
    {
        B2_NOT_USED(fixture);
        B2_NOT_USED(particleSystem);
        B2_NOT_USED(index);
    }
    virtual void BeginContact(b2ParticleSystem* particleSystem,
                              b2ParticleContact* particleContact)
    {
        B2_NOT_USED(particleSystem);
        B2_NOT_USED(particleContact);
    }
    virtual void EndContact(b2ParticleSystem* particleSystem,
                            int32 indexA, int32 indexB)
    {
        B2_NOT_USED(particleSystem);
        B2_NOT_USED(indexA);
        B2_NOT_USED(indexB);
    }
    virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)
    {
        B2_NOT_USED(contact);
        B2_NOT_USED(oldManifold);
    }
    virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)
    {
        B2_NOT_USED(contact);
        B2_NOT_USED(impulse);
    }
};

这是我的swig文件

%module(directors="1") b2WorldCallbacks;
%include "enums.swg"
%javaconst(1);
%feature("director") b2QueryCallback;
%feature("director") b2ContactListener;



%include "../../../Box2D/Box2D/Dynamics/b2WorldCallbacks.h"

生成此Java

public class MyContactListener extends ContactListener {

        @Override
        public void beginContact(Contact contact) {
            //System.out.println("Touch");
        }

        @Override
        public void endContact(Contact contact) {

        }

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {
            // TODO Auto-generated method stub
            super.preSolve(contact, oldManifold);
        }

        @Override
        public void postSolve(Contact contact, ContactImpulse impulse) {
            // TODO Auto-generated method stub
            super.postSolve(contact, impulse);
        }

        @Override
        public void beginContact(ParticleSystem particleSystem,
                SWIGTYPE_p_b2ParticleBodyContact particleBodyContact) {
            // TODO Auto-generated method stub
            super.beginContact(particleSystem, particleBodyContact);
        }

        @Override
        public void endContact(Fixture fixture, ParticleSystem particleSystem,
                int index) {
            // TODO Auto-generated method stub
            super.endContact(fixture, particleSystem, index);
        }

        @Override
        public void beginContact(ParticleSystem particleSystem,
                SWIGTYPE_p_b2ParticleContact particleContact) {
            // TODO Auto-generated method stub
            super.beginContact(particleSystem, particleContact);
        }

        @Override
        public void endContact(ParticleSystem particleSystem, int indexA,
                int indexB) {
            // TODO Auto-generated method stub
            super.endContact(particleSystem, indexA, indexB);
        }


    }

0 个答案:

没有答案