Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIG(Java):如何调用带有void*out参数的函数?_Java_Java Native Interface_Swig_Void Pointers - Fatal编程技术网

SWIG(Java):如何调用带有void*out参数的函数?

SWIG(Java):如何调用带有void*out参数的函数?,java,java-native-interface,swig,void-pointers,Java,Java Native Interface,Swig,Void Pointers,背景 我正在用C++代码库开发一个Android的实时通信应用程序。我使用SWIG生成一个JNI桥,以从Java访问本机代码。为了跟踪活动呼叫,将void*用作句柄(指向包含正在进行呼叫信息的地址)。以下函数标题是如何使用它的示例: void initiateCall(void**callHandleRef) void closeCall(void*callHandle) initateCall获取一个void**,分配一个结构并将其地址(作为void*)写入callHandleRef。它作为一

背景

我正在用C++代码库开发一个Android的实时通信应用程序。我使用SWIG生成一个JNI桥,以从Java访问本机代码。为了跟踪活动呼叫,将
void*
用作句柄(指向包含正在进行呼叫信息的地址)。以下函数标题是如何使用它的示例:

void initiateCall(void**callHandleRef)

void closeCall(void*callHandle)

initateCall
获取一个
void**
,分配一个结构并将其地址(作为void*)写入
callHandleRef
。它作为一个“out”参数工作,因为您将其作为参数传递,并期望向其写入一些内容。当调用<代码> CuxCuele/Cuff>时,传递原始指针,允许C++库访问与该特定调用相关联的数据。< /P> 问题描述


我想从Java调用
initiateCall
closeCall
,使用SWIG生成执行此操作所需的JNI代码。然而。SWIG分别生成类型“SWIGTYPE_p_p_void”和“SWIGTYPE_p_void”,我无法以上述方式使用这些类型。如何设置SWIG接口文件以允许我这样做?

柔印对这个问题的评论对我来说很有用,如图所示。这是我的解决方案,或多或少是他们答案的复制品

C++头文件(call.h):

SWIG接口(call.i):


用声明参数就足够了吗?你可能想为void使用一个类型别名,这样你也可以自动调用析构函数too@Flexo谢谢你,你链接的第二个答案对我很有用。
typedef void* CALL_HANDLE;

int initiateCall(const char* name, CALL_HANDLE* handle);
int closeCall(CALL_HANDLE handle);

%module bridge

%include <cpointer.i>

%pointer_class(CALL_HANDLE, inst_ptr);
%javamethodmodifiers initiateCall "private";
%pragma(java) modulecode=%{
  public static SWIGTYPE_p_void initiateCall(String name) {
      inst_ptr ptr = new inst_ptr();
      final int err = initiateCall(name, ptr.cast());
      if (0 != err) {
          // Throw error or something like that
      }
      return ptr.value();
  }
%}

%include "include/call.h"

extern int initiateCall(const char* name, CALL_HANDLE* handle);
extern int closeCall(CALL_HANDLE handle);
class MainActivity : AppCompatActivity() {
    private lateinit var callHandle: SWIGTYPE_p_void

    fun call(name: String) {
        callHandle = bridge.initiateCall(name)
    }

    fun hangup() {
        bridge.closeCall(callHandle)
    }
}