コンピュータのRS485インターフェイス上のデバイスと通信するためにJNAを使用し始めています。幸い私には、すぐに良い結果が出ました。しかし今、私は簡単な問題で立ち往生しています。私が使用するライブラリは、structのポインタへのポインタを受け取ります。実際の署名は、ライブラリーは、最後のポインタがNULLポインタであることを期待する最初のパラメータの大きさを示すために、今JNA:structポインタをNULLに設定する
func(Struct1 **, Struct2 **, Struct3 *, Struct4 *, long)
あります。これは失敗するものです。
Struct1.ByReference[] s = (Struct1.ByReference[]) new Struct1.ByReference().toArray(size);
int pos = 0;
// ...
// for loop to set the s[pos] struture values
for(pos = 0; pos < size - 1; pos++)
// ...
// Now set the last array element to a null pointer to indicate end-of-list
s[pos].getPointer().setPointer(0, null);// Following does not work: results in zero memoried structure
s[pos] = null; // Following does not work wither: NullPointerException at com.sun.jna.Structure.autoWrite
EDIT 1
s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well
EDIT 2
technomageの質問によると:コードに続いて、私がこれまで試したものです。私はCのコードを書くとしたら、それはおそらく、そのようなことになります。
Struct1 **s = malloc(n * sizeof(Struct1*));
for(int i=0; i<n; i++)
{
if(i == n -1)
{
s[i] = NULL;
}
else
{
s[i] = malloc(sizeof(Struct1));
s[i].bla = value;
....
}
}
をしかし、警告が表示さ:私はC/C++で非常に熟練していないです。私はJavaを私のドメインと考えています。
誰も同じような問題がありましたか?たぶん私は木の木を見ていないだけです...
ありがとうございます。
ネイティブ用のサンプルを含めてください。ポインタのバリエーションの関数宣言は、そのコンテキストなしではあいまいである可能性があります。つまり、配列へのポインタ、単一のポインタ値へのポインタ、またはいくつかの他のバリエーションを区別する方法はありません。 – technomage
「使用例」とはどういう意味ですか?このライブラリは、オープンソースのリアルタイムオペレーティングシステムであるFreeRTOSを実行する組み込み機器のコードから採用されました。ライブラリのメソッドをエクスポートするヘッダーファイルとは別にネイティブコードがありません。 –
あなたが望むやり方でライブラリにアクセスする 'C'のコードを書こうとすると、どのように見えますか? – technomage