如何从 JNA 调用 ALSA 分配#define?
How to call ALSA allocation #define from JNA?
我正在尝试使用 JNA 从 Java 调用 ALSA 库函数。我已经成功地调用了基本的 open/close APIs 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(¶ms);
和 "params" 然后被传递给许多后续的 API 调用。
我不是 C 专家,我无法弄清楚这是在做什么。我期望一个结构的内存分配,但头文件中的下一行定义了 snd_pcm_hw_params,如:
int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
那么这是否意味着宏正在返回指向函数的指针?我如何在 JPA 中对此建模?
此函数returns 一个指向您不知道其定义的结构的指针。 (这就是为什么您需要所有这些访问函数。)
alloca()
从堆栈分配内存,这意味着它会在当前函数 returns 后立即释放。这意味着您不能将其包装到要从 Java.
调用的函数中
而不是 snd_pcm_hw_params_alloca()
,使用 snd_pcm_hw_params_malloc()
,并且不要忘记在正确的时间调用 snd_pcm_hw_params_free()
。
我正在尝试使用 JNA 从 Java 调用 ALSA 库函数。我已经成功地调用了基本的 open/close APIs 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(¶ms);
和 "params" 然后被传递给许多后续的 API 调用。
我不是 C 专家,我无法弄清楚这是在做什么。我期望一个结构的内存分配,但头文件中的下一行定义了 snd_pcm_hw_params,如:
int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
那么这是否意味着宏正在返回指向函数的指针?我如何在 JPA 中对此建模?
此函数returns 一个指向您不知道其定义的结构的指针。 (这就是为什么您需要所有这些访问函数。)
alloca()
从堆栈分配内存,这意味着它会在当前函数 returns 后立即释放。这意味着您不能将其包装到要从 Java.
而不是 snd_pcm_hw_params_alloca()
,使用 snd_pcm_hw_params_malloc()
,并且不要忘记在正确的时间调用 snd_pcm_hw_params_free()
。