2015-03-20 4 views
0

Я следующий код C, что я пытаюсь карту в Java:ЮНА, как я иду от C Int * в ЮНА структуры

int32 Query(void* qryBuffer, 
      uint32_t qryLength) 
{ 
    static int8_t sendBuffer[MAX_REQUEST_SIZE]; 
    message* queryMessage; 
... 
    queryMessage = (message*)sendBuffer; 

    memcpy(&sendBuffer[0], &qryLength, sizeof(qryLength)); 
    memcpy(&sendBuffer[sizeof(qryLength)], qryBuffer, qryLength); 
... 
    query_ex(queryMessage); 
} 

typedef struct 
{        
    uint32  length_u;  
} message; 

Эквивалент ЮНА является для структуры сообщений является:

public static class message extends Structure { 
    public int length_u; 
    public message() { 
     super(); 
    } 
    protected List getFieldOrder() { 
     return Arrays.asList("length_u"); 
    } 
    public message(int length_u) { 
     super(); 
     this.length_u = length_u; 
    } 
    public static class ByReference extends omni_message implements Structure.ByReference { 
    }; 
    public static class ByValue extends omni_message implements Structure.ByValue { 
    }; 
}; 

Я знаю, что они делают в коде C, но я не могу понять, как это сделать на стороне Java. Мне нужно, чтобы класс сообщений Java содержал длину и массив параметров, которые были переданы в

Пожалуйста, помогите!

Update: Я создал свою собственную копию структуры сообщения, который содержит байт []:

public static class messageEx extends Structure { 
     public byte[] buffer; 
... 
    } 

Я собираюсь попробовать и передать эту структуру в качестве противопоставить другой, но я не может проверить до завтра.

int size = struct.size(); 
byte[] buffer = new byte[size]; 
ByteBuffer bb = ByteBuffer.wrap(buffer); 
bb.putInt(size); 
bb.put(struct.getPointer().getByteArray(0, size)); 
messageEx msg = new messageEx(buffer); 
query_ex(msg); // call to native world 
+0

Я попытался отредактировать сообщение, чтобы отформатировать его правильно, но это беспорядок. Пожалуйста, исправьте контент, чтобы использовать пробелы, а не   для каждого места! – JNYRanger

+0

Когда я использовал пробелы, он объединял несколько пробелов в одно пространство, как это делает html, поэтому я переключил их на nbsp. Есть ли другой способ опубликовать его? – JohnK

+0

Выделите весь код и нажмите кнопку '[{}]', чтобы отделить блок и, следовательно, сохранить его форматирование. – technomage

ответ

0

Вам не требуется сложность структур здесь, учитывая указатель буфера, который вы можете явно написать, что вам нужно. Все нативный код делает пишет длину буферной следовала его содержимое в другой буфер:

byte[] buffer; 
int length; 
Pointer msg_buffer = new Memory(buffer.length + 4); 

msg_buffer.setInt(0, length); 
msg_buffer.setByteArray(4, buffer, buffer.length); 

Конечно, вы можете предварительно выделить фиксированный буфер вместо того, чтобы создавать новую каждый раз (который является то, что собственный код делает).

+0

Это полезно. Я забыл упомянуть, что мне нужно передать структуру сообщений в метод (извините, что я новичок в задании вопросов). В c-коде: query_ex (queryMessage); Итак, мы ожидаем, что структура будет как параметр – JohnK

+0

. Я думаю, что мне может понадобиться изменить структуру, чтобы содержать байтовый буфер, но я не знаю, разрешит ли этот метод нативный C. – JohnK

+0

Думаю, у меня может быть это. Я сделал свою собственную версию сообщения, называемую messageEx, которая содержит байт [], а затем я сделал это (у класса структуры есть свой размер): '\t \t int size = struct.size(); \t \t байт [] buffer = новый байт [размер]; \t \t ByteBuffer bb = ByteBuffer.wrap (buffer); \t \t bb.putInt (размер); \t \t bb.put (struct.getPointer().getByteArray (0, размер)); \t \t messageEx msg = новое сообщениеEx (buffer); ' Вы видите какие-либо проблемы? Я не могу попробовать это до завтра: 9 – JohnK

0

Решение:

public int query(Structure struct) { 
    struct.write(); // this makes sure all my data is being ref'd by the pointer 
    int size = struct.size(); 
    Pointer p = new Memory(size + 4); 
    p.setInt(0, size); 
    p.write(4, struct.getPointer().getByteArray(0, size), 0, size); 
    message msg = new message(p, size); 
    query_ex(msg); // call to native world 

мне пришлось создать новый конструктор для класса сообщений, так что я могу иметь структуру использовать свой указатель. Примечание: размер не имеет смысла:

public message(Pointer p, int size) { 
    super(p); 
    this.length_u = size; 
} 
Смежные вопросы