2014-09-19 66 views
1

我在C以下代碼++(cocos2d的):轉換一個C++回調到Java

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; 
} 

當痛飲轉換爲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,但無法爲我的情況實現它。

+0

可能用JavaCPP完成它... – issamux 2014-10-20 22:13:03

回答

4

我不相信SWIG以任何有意義的方式支持成員函數指針。但是,可以通過JavaCPP完成。鑑於此C++代碼在一個文件名爲MemberFunction.h

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 
+0

我讀了很多關於JavaCPP的文章,它確實符合我們的需求,它只是團隊開始與SWIG合作,我們已經轉換了數百萬的代碼..我們無法切換那簡單。所以我正在尋找SWIG解決方案。 – 2014-09-22 10:57:28

1

您可能想看看「SEL_CallFunc選擇器」的類型圖。類型映射松鼠原始語言回調,這是通過tramploline函數調用。有python示例herehere。你會發現SO上的各種類似的Java問題。