저는이 질문 답변 포럼에 매우 익숙하며 swig에서도 마찬가지입니다. swig 인터페이스 파일을 사용하여 Java 및 C 용 래퍼를 생성하는 올바른 단계를 따르고 있는지 확실하지 않습니다.SWIG java의 구조체에서 함수 포인터를 처리하십시오.
%module test_app
%{
#include "example.h"
%}
%include "example.h"
내가 명령 swig -java test_app.i
을 사용하여 래퍼를 생성 할 때 다음과 같은 생성 된 파일
-
을 :
- sample_websocket_config.jav
- sample_websocket_module.java
- SWIGTYPE_p_void.java
- test_app.java
- test_app_wrap.c
- sample_websocket_connection_state.java
- SWIGTYPE_p_f_p_p_void_p_sample_websocket_config__void.java
test_appJNI.java
typedef struct { void(*websocket_request) ( sample_websocket_handle * handle, sample_websocket_config * config );
} sample_websocket_module; 위의 코드
#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
파일이 보인다
는
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));
}
미리 감사드립니다.