2017-09-27 1 views
1

저는이 질문 답변 포럼에 매우 익숙하며 swig에서도 마찬가지입니다. swig 인터페이스 파일을 사용하여 Java 및 C 용 래퍼를 생성하는 올바른 단계를 따르고 있는지 확실하지 않습니다.SWIG java의 구조체에서 함수 포인터를 처리하십시오.

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

%include "example.h" 

내가 명령 swig -java test_app.i을 사용하여 래퍼를 생성 할 때 다음과 같은 생성 된 파일

    을 :

    #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 아래 보이는 것처럼

    내 헤더 example.h 파일이 보인다

  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; 위의 코드

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을 만들었습니다이 함수에 인수를 제공하는 방법을 잘 모르겠습니다처럼 보이는 sample_websocket_module.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 방법이있을 것이다.

관련 문제