我记得我也曾在SWIG手册中对此参考挠头。
您可以按以下步骤进行操作,而无需使用深奥的功能:
您需要一种将传入的C回调分派到Java中的机制。为此,您需要调用的对象的对象ID和处理程序的方法ID。在您的C注册帮助器中,为这些创建全局引用,并缓存它们以供回调使用。
对于要作为参数传递给java回调的所有内容,您还都需要一个类ID和构造方法ID。您还想缓存那些全局引用。
在回调的C部分中,查找您的方法ID,构造参数并调用Java。
回调进入的线程需要附加到Java VM(使用JNI函数AttachCurrentThread())。这是从中获取JNIEnv指针的地方。该指针仅在您从中调用AttachCurrentThread()的线程的上下文中有效!这意味着,如果有多个线程传入回调,则需要将JNIEnv *缓存在线程本地存储中。
确保从JNI函数返回后检查返回值
确保在对Java进行任何和所有调用之后检查ExceptionOccurred()。不这样做会以难以调试的方式给您带来麻烦。
我发现使用Eclipse和Visual Studio调试起来相对容易,如下所示:从Eclipse启动主Java程序,将Visual Studio Debugger附加到该过程。您可以在任一侧设置断点。



