私はJNAプログラミングにはかなり新しいです。私は以下のようなネイティブコードを持っていますJNA構造内の構造
int Data(int Number, aaa *Data, int* error);
typedef struct {
uint8 Storage;
LStr path;
int32 chart;
int32 strt;
LStr val;
int32 timedata;
} aaa;
typedef struct {
int32 cnt; /*num of bytes that follow*/
uChar str[1];
} LStrval, *LStrPtr, **LStr;
JNAを使用してJavaからこのネイティブ関数を呼び出す方法を教えてください。私はいくつかのオプションを試しましたが、結果が得られません。私が試したオプションの1つは以下の通りです。
インタフェース機能
public int SetStorage_Data(int num,Storage_Data.ByReference data, Pointer error);
public class Storage_Data extends Structure{
public static class ByReference extends Storage_Data implements Structure.ByReference {}
public byte storage;
public Stringtype.ByReference savepath;
public int chart;
public int strt;
public Stringtype.ByReference val;
public int timedata;
@Override
protected List getFieldOrder() {
return Arrays.asList("storage", "savepath","chart",
"strt","val","timedata");
}
}
public class Stringtype extends Structure{
public static class ByReference extends Stringtype implements Structure.ByReference {
public ByReference(int buffersize) {
super(buffersize);
// TODO Auto-generated constructor stub
}}
public int count;
public byte[] str;
public Stringtype(int buffersize) {
str = new byte[buffersize];
count = str.length;
allocateMemory();
}
@Override
protected List getFieldOrder() {
return Arrays.asList("count", "str");
}
}
とJavaコール
InjectionAnalyzerInterfaces.Storage_Data.ByReference storagedata = new InjectionAnalyzerInterfaces.Storage_Data.ByReference();
int len= string.length;
InjectionAnalyzerInterfaces.Stringtype.ByReference savepath = new InjectionAnalyzerInterfaces.Stringtype.ByReference(len);
byte[] stringbyte = string.getBytes();
System.arraycopy(stringbyte, 0, savepath.str, 0, bytes);
storagedata.savepath = savepath;
storagedata.chart = 1;
storagedata.strt =1;
String temp= "all";
byte[] strtbyte = temp.getBytes();
int dd = strtbyte.length;
InjectionAnalyzerInterfaces.Stringtype.ByReference stra = new InjectionAnalyzerInterfaces.Stringtype.ByReference(dd);
System.arraycopy(strtbyte, 0, stra.str,0, dd);
storagedata.strt = stra;
storagedata.tdata = 0;
Pointer error = new Memory(5);
int status1 = lib.Set_Config_Storage_Data(deviceNumber, storagedata, error);
私を助けてください。事前にありがとう
私は 'それから、さまざまなを使用して、あなたはそれらのフィールドのための' Pointer'を使用して開始するお勧めしますあなたが望むようにデータを抽出して書式設定するための「Pointer」アクセスメソッド。逆参照のレベルを理解したら、それをマップする最も賢明な方法を理解することができます。しかし、あなたのフィールドは 'struct **'であるという点で根本的な問題があります。これはJNAが認識しないため、 '構造体へのすべての呼び出しです。「読み書き」は、あなたが実行することに全面的に依存します。 – technomage
@technomage 'Pointer.getPointer(0)'や 'PointerByReference.getValue()'を使う方が良いですか? –
ポインターのアドレスをパラメーターとしてパラメーターに渡す場合にのみ、 'PointerByReference'を使用してください。もしあなたがフィールドのどこかに 'void **'を持っていたら、 'Pointer'を使います。 – technomage