2017-09-27 17 views
1

Je suis très nouveau à cette question réponse forum et même dans le swig. Je ne suis pas sûr si je suis les étapes correctes pour générer des wrappers pour Java et C en utilisant le fichier d'interface swig.Poignée de pointeur de fonction dans une structure dans SWIG java

mon en-tête fichier example.h ressemble ci-dessous

#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 

Et mon fichier interface test_app.i ressemble ci-dessous:

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

%include "example.h" 

Et quand je produis des enveloppes en utilisant la commande swig -java test_app.i qui génère des fichiers suivants

  1. sample_websocket_config.jav un
  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;

code ci-dessus génère la classe sample_websocket_module.java qui ressemble à ci-dessous

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

} 

Je ne suis pas sûr de savoir comment fournir des arguments à cette fonction car il a fusionné les deux arguments et a créé une catégorie distincte 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; 
    } 
} 

et c'est la fonction qui utilise la classe ci-dessus. Alors, comment puis-je fournir des valeurs à cette fonction.

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

Merci d'avance.

Répondre

1

Je pense que vous devrez ajouter du code C qui fera le déréférencement du pointeur que vous pourriez alors appeler. Vous pouvez ajouter une fonction dans le fichier d'interface qui sera collée dans test_app_wrap.c.

Alors test_app.i devient:

%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); 

Maintenant, il y aura une méthode callwebsocketreq dans le test_app.java que vous pouvez appeler à passer dans ces arguments.