Java LibGDX项目符号扩展是如何实现的';你的工作是什么?

Java LibGDX项目符号扩展是如何实现的';你的工作是什么?,java,libgdx,bulletphysics,Java,Libgdx,Bulletphysics,我一直在阅读这篇关于使用LibGDX子弹包装器的博客文章: 我无法理解有关使用ContactListener回调的部分。要创建冲突回调,只需使用重写的方法扩展ContactListener类,然后实例化它 其他什么都不需要做。代码可以完美地工作,而无需再次引用实例。这怎么可能呢?这是因为在幕后发生了一些事情。bullet包装器通过JNI调用bullet。这主要是通过类CollisionJNI实现的,该类有很多静态方法 当查看ContactListener类的 public ContactLis

我一直在阅读这篇关于使用LibGDX子弹包装器的博客文章:

我无法理解有关使用
ContactListener
回调的部分。要创建冲突回调,只需使用重写的方法扩展
ContactListener
类,然后实例化它


其他什么都不需要做。代码可以完美地工作,而无需再次引用实例。这怎么可能呢?

这是因为在幕后发生了一些事情。bullet包装器通过JNI调用bullet。这主要是通过类
CollisionJNI
实现的,该类有很多静态方法

当查看ContactListener类的

public ContactListener() {
    this(false);
    if (!setEvents())
        throw new com.badlogic.gdx.utils.GdxRuntimeException("Only one method per callback event can be overridden.");
    enable();
}

...

public void enable() {
    CollisionJNI.ContactListener_enable(swigCPtr, this);
}
正如您所看到的,
ContactListener
(在实例化扩展它的任何子类时也会调用它)的构造函数将自动调用
enable()
,它通过JNI将此实例注册为回调侦听器

这里没有黑魔法:=)


如果这会让您感觉更舒服,您可以自己添加对
myContactListener.enable()
的调用。同样,可以调用
myContactListener.disable()
将其关闭。

因此,如果我理解正确,
CollisionJNI
在实例化时保留对
ContactListener
的引用,然后
btCollisionWorld.performDiscreteCollisionDetection
CollisionObject
传递到
CollisionJNI
,它执行碰撞检测计算,并在必要时触发
ContactListener
回调。对吗?不,
CollisionJNI
不保留任何引用。它的唯一目的是通过JNI连接libgdx和bullet。<代码> CistaSeristAudio/Cuth>本身存储指针到本机C++对象(只是一个<代码>长< /COD>值)。但是,我不确定bullet->libgdx的通信实际上是如何工作的。好的,这是有意义的。然后我假设C++端还必须有一个指针返回到java < COD> CONTACTISTHEENER >是的,类似的东西。您应该检查以下内容: