long *val
として表されるCの配列をJavaコードに返すにはどうすればよいでしょうか。
この方法でこれを行うことができない場合、他にどのようにして配列をJavaに戻すことができますか?
long *val
として表されるCの配列をJavaコードに返すにはどうすればよいでしょうか。
この方法でこれを行うことができない場合、他にどのようにして配列をJavaに戻すことができますか?
log * val以上のものが必要になり、C配列内のアイテムの数も必要になります。次に、それをそのサイズの配列に変換するだけです。
まず、Cでは配列型を返すことはできません。あなたの質問では、「long*valとして表されるCの配列」を参照しています。それは配列ではありません。ご存知のように、long *
はlongへのポインタです。では、なぜこれが重要なのでしょうか。ポインタを返しているからです。配列ではありません。これは、ポインタが指すメモリが、ユーザーがそれを参照しようとしたときに割り当てられることを確認する必要があることを意味します。Cでよくあるエラーは、自動ストレージ(つまり、関数自体のスタックフレーム)に割り当てられたメモリへのポインタを返すことです。これは間違っています。関数からポインタを返す場合、そのポインタは次のいずれかのメモリを指している必要があります。その関数の上のスタックフレーム上にあるため、で割り当てられたメモリなど、まだ割り当てられていることがわかります。main()
、割り当てられた静的メモリ(グローバル配列など)、またはヒープに割り当てられたメモリ(によって返されるメモリなどmalloc()
)。
免責事項:上記で使用されているヒープ、スタック、およびその他の用語は、標準Cとはまったく関係ありません。実用的な目的では、それらは存在すると想定しましたが、目的のために、そうでないメモリを指すべきではないという考えを理解してください。そこにいないので、ポインタを逆参照します。
さて、これはJNIとJavaに関連しているので、いくつかの懸念があります。まず、Java配列は、Cの配列と同じようにメモリに配置されません。Javaでは、配列の要素が連続して格納される保証はありません。他にも無数の問題があると思いますが、私はこの分野の専門家ではありません。
それで、解決策は何ですか?
アプローチを選択します。この投稿で概説されているように、longの配列をJava jLongArrayにコピーするか、JavaからCで割り当てたメモリにアクセスするためのAPIを設計する必要があります。
ただし、配列へのポインタをJavaに返し、Cスタイルでアクセスするオプションはありません。Javaにはポインタがなく、JavaはCではありません。