2017-03-31 23 views
1

JavaからALSAライブラリ関数を呼び出すためにJNAを使用しようとしています。私は基本的なオープン/クローズAPI snd_pcm_open()とsnd_pcm_close()を呼び出すことに成功していますので、ライブラリのロードとOKの基本がわかります。JLSからALSA割り当て#defineを呼び出す方法は?

私のアプリケーションがALSAで行う必要があることは、ハードウェアパラメータ構造体を割り当てるためにsnd_pcm_hw_params_alloca()を呼び出すことです。

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

それは、このように呼ばれることになるCアプリケーションの場合:しかし、これはマクロではなく、シンボルとしてC header fileに定義されている

snd_pcm_hw_params_t *params; 
snd_pcm_hw_params_alloca(&params); 

と「paramsが」その後、多くの後続のに渡され、 API呼び出し。

私はCの専門家ではありませんが、これが何をしているのか正確には分かりません。 Iは、構造のメモリ割り当てを期待するが、ヘッダファイルの次の行は次のようsnd_pcm_hw_paramsを定義:これはマクロが関数へのポインタを返す意味

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

? JPAでこれをどのようにモデル化できますか?

+0

ハードウェアパラメータの割り当ては、通常、 'snd_pcm_hw_params_malloc'を使って行われます。あなたが話している関数は、ヒープの代わりにスタックにメモリを割り当てます。私はJavaの専門家ではないが、スタック割り当てがJavaアプリケーションのために機能するとは思わない。 – tay10r

答えて

2

この関数は、定義がわからない構造体へのポインタを返します。 (これにより、それらのアクセサ関数がすべて必要になります)

alloca()はスタックからメモリを割り当てます。これは、現在の関数が返されるとすぐに解放されることを意味します。つまり、これをJavaから呼び出す関数にラップすることはできません。

snd_pcm_hw_params_alloca()の代わりにsnd_pcm_hw_params_malloc()を使用してください。snd_pcm_hw_params_free()に正確な時刻にお電話いただくことを忘れないでください。

+0

はい、Cの専門知識がなく、ALSAサンプルのCプログラムに盲目的に従わなかったため、間違ったAPIパスが導かれました。 'snd_pcm_hw_params_malloc()'のJNA定義を書きました。すべて正常に動作します。同じ答えで@ tay10rにも感謝します。 – user3191192