gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:54 25 4
gpt4 key购买 nike

我是这个问答论坛的新手,在 swig 中也是如此。我不确定我是否按照正确的步骤使用 swig 接口(interface)文件为 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

我的接口(interface)文件 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;

上面的代码生成如下所示的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 代码来执行您随后可以调用的指针取消引用。您可以在接口(interface)文件中添加一个函数,该函数将被粘贴到 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 方法,您可以调用它来传递这些参数。

关于java - 在 SWIG java 中处理结构中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46447886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com