转换为C++;回调到Java 我在C++中有以下代码:(COSCO2D):

转换为C++;回调到Java 我在C++中有以下代码:(COSCO2D):,java,c++,swig,Java,C++,Swig,使用swig转换为java时,我得到以下结果: public static CCCallFunc actionWithTarget(CCObject pSelectorTarget, SWIGTYPE_m_CCObject__f___void selector) { long cPtr = cocos2dxMappingJNI.CCCallFunc_actionWithTarget(CCObject.getCPtr(pSelectorTarget), pSelectorTarget,

使用swig转换为java时,我得到以下结果:

public static CCCallFunc actionWithTarget(CCObject pSelectorTarget, SWIGTYPE_m_CCObject__f___void selector) {
    long cPtr = cocos2dxMappingJNI.CCCallFunc_actionWithTarget(CCObject.getCPtr(pSelectorTarget), pSelectorTarget,
            SWIGTYPE_m_CCObject__f___void.getCMemberPtr(selector));
    return (cPtr == 0) ? null : new CCCallFunc(cPtr, false);
}
其中,
SWIGTYPE\u m\u cObject\uu f\uu\u void
只是一个我无法使用的指针

如何在SWIG接口中实现这一点?
我已经研究过这个解决方案,但无法在我的案例中实现它

我不认为SWIG以任何有意义的方式支持成员函数指针。然而,这是有可能完成的。给定一个名为<>代码>成员函数的C++代码。
class MyClass {
public:
    virtual ~MyClass() { }
};

typedef void (MyClass::*MyFunction)(const char *str);

void callback(MyClass* cls, MyFunction fct, const char *str) {
    (cls->*fct)(str);
}
在Java中,我们可以这样定义和使用回调:

import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;

@Platform(include="MemberFunction.h")
public class MemberFunction {
    static { Loader.load(); }

    public static abstract class MyClass extends Pointer {
        public MyClass() { allocate(); }
        private native void allocate();

        @Virtual public abstract void myCallback(String str);

        @Virtual @MemberGetter @Name("myCallback") 
        public static native MyFunction getMyCallback();
    }

    @Namespace("MyClass")
    public static class MyFunction extends FunctionPointer {
        public native void call(MyClass cls, String str);
    }

    public static native void callback(MyClass cls, MyFunction fct, String str);

    public static void main(String[] args) {
        MyClass cls = new MyClass() {
            public void myCallback(String str) { 
                System.out.println(str);
            }
        };
        MyFunction fct = MyClass.getMyCallback();
        callback(cls, fct, "Hello World");
    }
}
它可以建立良好的性能并输出预期结果:

$ javac -cp javacpp.jar MemberFunction.java
$ java -jar javacpp.jar MemberFunction
$ java  -cp javacpp.jar MemberFunction
Hello World

我不相信SWIG以任何有意义的方式支持成员函数指针。然而,这是有可能完成的。给定一个名为<>代码>成员函数的C++代码。
class MyClass {
public:
    virtual ~MyClass() { }
};

typedef void (MyClass::*MyFunction)(const char *str);

void callback(MyClass* cls, MyFunction fct, const char *str) {
    (cls->*fct)(str);
}
在Java中,我们可以这样定义和使用回调:

import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;

@Platform(include="MemberFunction.h")
public class MemberFunction {
    static { Loader.load(); }

    public static abstract class MyClass extends Pointer {
        public MyClass() { allocate(); }
        private native void allocate();

        @Virtual public abstract void myCallback(String str);

        @Virtual @MemberGetter @Name("myCallback") 
        public static native MyFunction getMyCallback();
    }

    @Namespace("MyClass")
    public static class MyFunction extends FunctionPointer {
        public native void call(MyClass cls, String str);
    }

    public static native void callback(MyClass cls, MyFunction fct, String str);

    public static void main(String[] args) {
        MyClass cls = new MyClass() {
            public void myCallback(String str) { 
                System.out.println(str);
            }
        };
        MyFunction fct = MyClass.getMyCallback();
        callback(cls, fct, "Hello World");
    }
}
它可以建立良好的性能并输出预期结果:

$ javac -cp javacpp.jar MemberFunction.java
$ java -jar javacpp.jar MemberFunction
$ java  -cp javacpp.jar MemberFunction
Hello World

您可能需要查看“SEL_CallFunc选择器”的类型映射。typemap将原始语言回调隐藏起来,该回调通过一个tramploline函数调用。这里有python示例和示例。您将在SO上找到各种类似的java问题。

您可能想查看“SEL_CallFunc selector”的类型映射。typemap将原始语言回调隐藏起来,该回调通过一个tramploline函数调用。这里有python示例和示例。你会发现java的各种类似问题。

我读了很多关于JavaCPP的文章,它确实符合我们的需要,只是团队开始使用SWIG,我们已经转换了数百万代码。。我们不能简单地切换。所以我正在寻找一个SWIG解决方案。我读了很多关于JavaCPP的书,它确实符合我们的需要,只是团队开始使用SWIG,我们已经转换了数百万代码。。我们不能简单地切换。所以我正在寻找一个SWIG解决方案。可能用JavaCPP完成它…可能用JavaCPP完成它。。。