当前位置: 首页 > 知识库问答 >
问题:

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

韩寂离
2023-03-14

二.背景

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

空初始化调用(空**调用HandleRef);

void closeCall(void*callHandle)

initateCall接受一个val**,分配一个结构并将它的地址(作为空*)写入call HandleRef。它作为“out”参数工作,因为您将其作为参数传递并期望向其写入某些内容。当调用closeCall时,会传递原始指针,允许C库访问与该特定调用关联的数据。

问题描述

我想从Java调用firateCallcloseCall,使用SWIG生成这样做所必需的JNI代码。但是。SWIG分别生成类型"SWIGTYPE_p_p_void"和"SWIGTYPE_p_void",我无法以上述方式使用这些。如何设置我的SWIG接口文件以允许我这样做?


共有1个答案

翟嘉祥
2023-03-14

Flexo对这个问题的评论对我很有用,就像这里看到的。这是我的解决方案,或多或少是复制粘贴的。

C标题(call.h):

typedef void* CALL_HANDLE;

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

SWIG接口(call.i):

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

主要活动(MainActivity.kt):

class MainActivity : AppCompatActivity() {
    private lateinit var callHandle: SWIGTYPE_p_void

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

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

 类似资料:
  • 问题内容: 我正在向Django的模板传递一个函数,该函数返回一些记录。我想调用此函数并遍历其结果。 那不行 我试图将函数的返回值设置为变量并遍历该变量,但是似乎没有办法在Django模板中设置变量。 有什么正常的方法吗? 问题答案: 你不能调用在模板中需要参数的函数。写一个模板标签或过滤器。

  • 我正在使用基于WebRTC的C代码库为Android开发一个实时通信应用程序(视频和音频)。我使用SWIG生成一个JNI桥,以从Java访问本机代码。调用的行为是通过在应用程序层中定义并在结构中传递给库代码的许多回调函数来确定的。传递这些回调的函数如下所示:

  • 问题内容: 在PL / SQL(或许多其他语言)中,我可以具有从过程返回的IN OUT或OUT参数。如何在Java中实现类似的目的? 我知道这个窍门: 其中参数表示IN参数,并且参数可以包含返回值。约定是的数组。 有点笨拙。 编辑对答案的反馈 :其他技巧包括: 持有人/包装师类,但我不想介绍任何新类型,回调等。 返回值:我想要一个 通用的 解决方案。即一个涉及多个IN OUT参数。 IN OUT参

  • 我是一个C的初学者,我想使用一个具有空函数的空函数作为传递的参数,然后我想用递归的方式调用它。例如但是很明显,我不能使用它,因为参数没有返回类型。有人对如何递归调用它有什么建议吗?谢谢!

  • 问题内容: 我需要用SWIG包装一个C ++库,以便将其与Java一起使用。 我已经有一些方法可以使用,但是遇到一种我不知道如何解决的情况。 我有几种这样的方法: 注意:实际上,这是名为MyClass的类的成员方法。 我可以将第一个方法更改为返回a 而不是being ,它应该可以工作;但是我不知道如何处理第二种方法,其中最后两个参数是输出参数。我已经看到了几个有关输出参数的问题(使用Swig/ P

  • 嗨,我为tictactoe游戏编写了这个示例代码,除了checkWinner函数之外,其他都正常工作,它接受两个参数ArrayList和currentPlayer来检查胜利者。该函数在每个玩家在tictactoe游戏中查看获胜的点击单元格后调用。我不知道错误在哪里!事先谢谢你