将C++回调转换为Java
Convert a C++ callback to Java
我在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
您可能想要查看"SEL_CallFunc选择器"的类型映射。typemap通过蹦床函数调用原始语言回调。这里和这里都有python的例子。在SO.
相关文章:
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 我需要帮助将我的代码从 c++ 转换为 java
- 将C++映射转换为 Java 映射
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- C++ (U256)*(H256 const*)(char*[] + int) 将重写转换为 Java
- JNA 将 HICON 转换为 Java Image
- 从c++到java的矢量转换
- 如何将通过TCP发送数据的数据从C++转换为Java
- 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
- MySQL 连接器错误,将代码从 Java 转换为 C++
- 将Java转换为C++:模板与泛型
- Java C/C++ 转换中的指针
- 将Java转换为Symbian C/C++ - 字节和对象数组
- 从 C++、C#、Perl 或 Java 转换为 PHP
- 用java转换MFC桌面应用程序GUI
- 将字符串从Java转换为C++
- Android 中的 OpenCV Rotate(纠偏) - C++ to Java 转换
- Java到C/ c++,或者至少得到Java转换后的代码
- 将我的c++代码转换为Java:转换多重继承
- C++ 关于外部"C"的 Java 转换问题