【问题标题】:How to call ALSA allocation #define from JNA?如何从 JNA 调用 ALSA 分配#define?
【发布时间】:2017-08-26 04:45:01
【问题描述】:

我正在尝试使用 JNA 从 Java 调用 ALSA 库函数。我已经成功调用了基本的打开/关闭 API snd_pcm_open() 和 snd_pcm_close(),所以我知道我的库加载正常并且基本正确。

我的应用程序需要对 ALSA 做的第一件事是调用 snd_pcm_hw_params_alloca() 来分配硬件参数结构。但这在C header file 中被定义为宏,而不是符号:

#define snd_pcm_hw_params_alloca(ptr) __snd_alloca(ptr, snd_pcm_hw_params)

对于 C 应用程序,它会这样调用:

snd_pcm_hw_params_t *params;
snd_pcm_hw_params_alloca(&params);

然后将“params”传递给许多后续的 API 调用。

我不是 C 专家,我无法弄清楚这是在做什么。我期望一个结构的内存分配,但头文件中的下一行定义了 snd_pcm_hw_params,如:

int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);

这是否意味着宏正在返回一个指向函数的指针?如何在 JPA 中对此进行建模?

【问题讨论】:

  • 硬件参数的分配通常使用snd_pcm_hw_params_malloc完成。您正在谈论的函数在堆栈而不是堆上分配内存。我不是 Java 专家,但我认为堆栈分配不适用于 Java 应用程序

标签: java c jna alsa


【解决方案1】:

此函数返回一个指向您不知道其定义的结构的指针。 (这就是你需要所有这些访问器函数的原因。)

alloca() 从堆栈中分配内存,这意味着一旦当前函数返回,它就会被释放。这意味着您不能将其包装到要从 Java 调用的函数中。

不要使用snd_pcm_hw_params_alloca(),而是使用snd_pcm_hw_params_malloc(),并且不要忘记在正确的时间拨打snd_pcm_hw_params_free()

【讨论】:

  • 是的,我缺乏 C 专业知识,而且盲目地遵循 ALSA 示例 C 程序导致我走错了 API 路径。为snd_pcm_hw_params_malloc() 编写了 JNA 定义,一切正常。也感谢@tay10r 给出了相同的答案。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多