如何从JNA调用ALSA分配#define?

时间:2017-03-31 19:54:37

标签: java c jna alsa

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

我的应用程序需要做的第一件事就是调用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中对此进行建模?

1 个答案:

答案 0 :(得分:2)

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

alloca()从堆栈中分配内存,这意味着它会在当前函数返回后立即释放。这意味着您无法将其包装到要从Java调用的函数中。

而不是snd_pcm_hw_params_alloca(),请使用snd_pcm_hw_params_malloc(),而不要忘记在正确的时间致电snd_pcm_hw_params_free()