我在JNA中有以下结构。我想使用pragma pack删除C中的填充和对齐。当我从C运行它运行正常。我正在使用这个DLL从Java调用。当我调用它时,JVM崩溃了。我在我的DLL中做的设置是否适用于从Java调用的时候?我尝试将setAlignment类型添加到None。仍然没有帮助。在C中,这个结构重达405.它完美地表示没有填充或对齐。在Java中,当我在调试时将鼠标悬停在_report值上时,它显示的大小为405,但它崩溃了。当我指定大小为480时,它不会崩溃。这是带有填充和对齐的大小。我在这里做错了什么?
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
PACK(
typedef struct
{
size_t size;
uint8_t bytes[48];
} ipj_tid_t);
PACK(
typedef struct
{
bool has_epc; //1
ipj_epc_t epc; //64+8
bool has_tid; //1
ipj_tid_t tid; //48+8
bool has_pc; //1
uint32_t pc; //4
bool has_xpc; //1
uint32_t xpc; //4
bool has_crc; //1
uint32_t crc; //4
bool has_timestamp; //1
uint64_t timestamp; //8
bool has_rssi; //1
int32_t rssi; //4
bool has_phase; //1
int32_t phase; //4
bool has_channel; //1
uint32_t channel; //4
bool has_antenna; //1
uint32_t antenna; //4
} ipj_tag); //total size= 174
PACK(
typedef struct
{
bool has_error;
ipj_error error;
bool has_test_id;
uint32_t test_id;
bool has_result_1;
uint32_t result_1;
bool has_result_2;
uint32_t result_2;
bool has_result_3;
uint32_t result_3;
size_t data_count;
uint32_t data[16];
bool has_timestamp;
uint64_t timestamp;
size_t lt_buffer_count;
uint32_t lt_buffer[21];
} ipj_test_report);
PACK(
typedef struct
{
size_t size;
uint8_t bytes[64];
} ipj_tag_operation_data_t);
PACK(
typedef struct
{
bool has_error; //1
ipj_error error; //4
bool has_tag; //1
ipj_tag tag; //174
bool has_tag_operation_type; //1
ipj_tag_operation_type tag_operation_type; //4
bool has_tag_operation_data; //1
ipj_tag_operation_data_t tag_operation_data; //72
bool has_retries; //1
uint32_t retries; //4
bool has_diagnostic; //1
uint32_t diagnostic; //4
bool has_timestamp; //1
uint64_t timestamp; //8
size_t lt_buffer_count; //8
uint32_t lt_buffer[30]; //120
} ipj_tag_operation_report); //405
以下是JNA等效结构。
public class _ipj_report_id extends Structure {
public int ipj_report_id;
public _ipj_report_id() {
super();
setAlignType(ALIGN_NONE);
}
@Override
protected List getFieldOrder() {
return Arrays.asList("ipj_report_id");
}
}
public class _report extends Structure {
public static class ByValue extends _report implements Structure.ByValue {
}
public _report() {
super();
setAlignType(ALIGN_NONE);
}
public _ipj_report_id reportid;
public int data_size;
public int[] data = new int[420]; // earlier was 138
@Override
protected List getFieldOrder() {
return Arrays.asList("reportid", "data_size", "data");
}
}