在SWIG中处理结构中的函数指针java

问题描述:

我对这个问题的回答论坛和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)); 
    } 

在此先感谢。

我认为你需要添加一些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方法。