Задать вопрос

Как удобнее всего эмитировать структуру С(С++) в java (под Android)?

Здравствуйте!
В программу под android по Bluetooth передаются данные. Данные представляют большие структуры, которые в С описываются примерно так
struct
{
uint16_t  data0;
uint32_t  data1;
uint16_t  data2;
.....

uint8_t dataN
}

элементы структуры могут быть произвольной длины до ( 4 байт). Структура упакована, без выравнивания.
Прием у меня сделан в С++ NDK, там я их храню и обращаюсь по отдельной ф-ции, которая является банальным switch.
Данный подход считаю тупиковым. Хочется копировать структуры в java и использовать их там так же как в Сях. Знаю Java не поддерживает прямую работу с памятью, но надеюсь что найдется обходной маневр.
С java и android дело имею в первый раз. До этого работал с С++ на МК.
Какие будут предложения, как симулировать работу структуры в java?
P.S. От структур отказаться нельзя(
  • Вопрос задан
  • 2720 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
vlad20012
@vlad20012
В Java Обычной практикой является чтение/запись отдельно каждой переменной из/в DataInputStream/DataOutputStream. Чтобы читать/писать целую структуру, создаем методы writeTo(DataOutoutStream data), readFrom(DataInputStream data) и пишем туда все элементы структуры, например
public class SomeStruct {
    public int i1;
    public int i2;

    public void writeTo(DataOutputStream data) {
        data.writeInt(i1);
        data.writeInt(i2);
    }
    public void readFrom(DataInputStream data) {
        i1 = data.readInt();
        i2 = data.readInt();
    }
}


Но из-за того, что запись производится в сишном коде, могут возникнуть проблемы. Дело в том, что существует два варианта порядка байтов. Какой конкретно попадется вам, зависит от платформы. На x86 используется little-endian. Но при чтении из DataInputStream используется big endian. Да и вообще, при передаче по сети принято использовать именно big endian. Так что при записи придется разворачивать байты. Но если очень припрет - можно и при чтении. Например, порядок байтов типа int можно изменить такInteger.reverseBytes(i1);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
aratj
@aratj
программер.
не понятно, что вы хотите видеть на стороне андроида, как с этим хотите в дальнейшем работать.

и в чем затык конкретно ?
Ответ написан
hrls
@hrls
Возможно стоит отказаться от попытки эмулировать структуры с доступом по именованному полю и обратить внимание на класс java.util.BitSet
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы