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

时间:2017-09-27 12:28:47

标签: java c java-native-interface swig

我对这个问题答案论坛很新,同样在swig中。我不确定我是否遵循正确的步骤使用swig接口文件为java和C生成包装器。

我的标题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.java
  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;

  9. 上面的代码会生成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 个答案:

答案 0 :(得分: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方法,你可以调用它来传递这些参数。