我正在尝试使用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);
}
}