gpt4 book ai didi

java - 将 C++ 回调转换为 Java

转载 作者:行者123 更新时间:2023-11-30 01:16:43 24 4
gpt4 key购买 nike

我在 C++ (Cocos2d) 中有以下代码:

typedef void (CCObject::*SEL_CallFunc)();
CCCallFunc * CCCallFunc::actionWithTarget(CCObject* pSelectorTarget,
SEL_CallFunc selector) {
CCCallFunc *pRet = new CCCallFunc();

if (pRet && pRet->initWithTarget(pSelectorTarget)) {
pRet->m_pCallFunc = selector;
pRet->autorelease();
return pRet;
}

CC_SAFE_DELETE(pRet);
return NULL;
}

当使用 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_m_CCObject__f___void 只是我不能使用的指针。

如何在 SWIG 界面中实现它?我研究了这个解决方案 stackoverflow但无法针对我的情况实现。

最佳答案

我不认为 SWIG 以任何有意义的方式支持成员函数指针。但是,可以使用 JavaCPP 来完成它.在名为 MemberFunction.h 的文件中给出此 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

关于java - 将 C++ 回调转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com