2017-09-27 54 views
1

我對這個問題的回答論壇和swig中的新問題很陌生。我不知道我是否按照正確的步驟使用swig接口文件生成java和C的包裝。在SWIG中處理結構中的函數指針java

我的頭example.h文件看起來像下面

#ifndef INCLUDE_ARTIK_WEBSOCKET_H_ 
#define INCLUDE_ARTIK_WEBSOCKET_H_ 

#ifdef __cplusplus 
extern "C" { 
#endif 
typedef enum { 
    SAMPLE_WEBSOCKET_CLOSED = 1, 
    SAMPLE_WEBSOCKET_CONNECTED, 
    SAMPLE_WEBSOCKET_HANDSHAKE_ERROR 
} sample_websocket_connection_state; 

typedef void *sample_websocket_handle; 

typedef struct { 
    char *uri; 
void *private_data; 
} sample_websocket_config; 


typedef struct { 
    void(*websocket_request) (
       sample_websocket_handle * handle, 
       sample_websocket_config * config 
       ); 

} sample_websocket_module; 

extern const sample_websocket_module websocket_module; 

#ifdef __cplusplus 
} 
#endif 
#endif 

我的接口文件test_app.i看起來象下面這樣:

%module test_app 
%{ 
#include "example.h" 
%} 

%include "example.h" 

當我生成使用命令swig -java test_app.i包裝生成以下文件

  1. sample_websocket_config.jav一個
  2. sample_websocket_module.java
  3. SWIGTYPE_p_void.java
  4. test_app.java
  5. test_app_wrap.c
  6. sample_websocket_connection_state.java
  7. SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void.java
  8. test_appJNI.java

    typedef struct { 
    void(*websocket_request) (
          sample_websocket_handle * handle, 
          sample_websocket_config * config 
          ); 
    

    } sample_websocket_module;

上面的代碼生成sample_websocket_module.java類,它看起來像下面

public class sample_websocket_module { 
    private transient long swigCPtr; 
    protected transient boolean swigCMemOwn; 

    protected sample_websocket_module(long cPtr, boolean cMemoryOwn) { 
    swigCMemOwn = cMemoryOwn; 
    swigCPtr = cPtr; 
    } 

    protected static long getCPtr(sample_websocket_module obj) { 
    return (obj == null) ? 0 : obj.swigCPtr; 
    } 

    protected void finalize() { 
    delete(); 
    } 

    public synchronized void delete() { 
    if (swigCPtr != 0) { 
     if (swigCMemOwn) { 
     swigCMemOwn = false; 
     test_appJNI.delete_sample_websocket_module(swigCPtr); 
     } 
     swigCPtr = 0; 
    } 
    } 

    public void setWebsocket_request(SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void value) { 
    test_appJNI.sample_websocket_module_websocket_request_set(swigCPtr, this, SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void.getCPtr(value)); 
    } 

    public SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void getWebsocket_request() { 
    long cPtr = test_appJNI.sample_websocket_module_websocket_request_get(swigCPtr, this); 
    return (cPtr == 0) ? null : new SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void(cPtr, false); 
    } 

    public sample_websocket_module() { 
    this(test_appJNI.new_sample_websocket_module(), true); 
    } 

} 

所以我不知道如何提供參數這一功能,因爲它融合了雙方的觀點,並創建了一個單獨的類SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void.java

public class SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void { 
    private transient long swigCPtr; 

    protected SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void(long cPtr, @SuppressWarnings("unused") boolean futureUse) { 
    swigCPtr = cPtr; 
    } 

    protected SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void() { 
    swigCPtr = 0; 
    } 

    protected static long getCPtr(SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void obj) { 
    return (obj == null) ? 0 : obj.swigCPtr; 
    } 
} 

這是使用上面的類的函數。那麼如何爲這個函數提供值。

public void setWebsocket_request(SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void value) { 
    test_appJNI.sample_websocket_module_websocket_request_set(swigCPtr, this, SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void.getCPtr(value)); 
    } 

在此先感謝。

回答

1

我認爲你需要添加一些C代碼來完成你可以調用的指針解引用。你可以在接口文件中添加一個將被粘貼到test_app_wrap.c中的函數。

所以test_app.i變爲:

%module test_app 
%{ 
#include "example.h" 

    void callwebsocketreq(sample_websocket_module *mod, 
       sample_websocket_handle * handle, 
       sample_websocket_config * config) { 
     (*mod->websocket_request)(handle,config); 
    } 

%} 

%include "example.h" 
void callwebsocketreq(sample_websocket_module *mod, 
       sample_websocket_handle * handle, 
       sample_websocket_config * config); 

現在會出現在你可以調用這些參數傳遞test_app.java一個callwebsocketreq方法。

相關問題