Как конвертировать int [] в ByteBuffer в Java? - PullRequest
3 голосов
/ 25 февраля 2012

, как уже сказано в заголовке, мне нужно преобразовать int [] в ByteBuffer в Java. Есть ли рекомендуемый способ сделать это?

Я хочу передать ByteBuffer через JNI в C ++. На что мне обращать внимание применительно к каким-либо конкретным преобразованиям порядка байтов в этом случае?

Редактировать: Извините, я по ошибке написал ByteArray, но имел в виду тип ByteBuffer.

Редактировать: Пример кода:

Я убрал лишние части. Я вызываю Java-функцию через JNI из c ++, чтобы загрузить ресурс и передать его обратно в c ++ в качестве байтового буфера. Работает с различными другими ресурсами. Теперь у меня есть int [] и я хотел бы знать, есть ли элегантный способ преобразовать его в байтовый буфер или мне нужно пойти старомодным способом и заполнить его циклом for.

ByteBuffer  resource= null;
resource = ByteBuffer.allocateDirect((x*y+2)*4).order(ByteOrder.nativeOrder());
.
.
ByteBuffer GetResourcePNG(String text)
{
    .
    .
    int []  pix;
    map.getPixels(pix,0,x,0,0,x,y);

    return resource;
}

Ответы [ 3 ]

6 голосов
/ 25 февраля 2012

Вы должны использовать ByteBuffer.allocateDirect, если хотите иметь возможность использовать JNI's GetDirectBufferAddress.

Используйте ByteBuffer.order(ByteOrder.nativeOrder()), чтобы настроить порядковый номер экземпляра ByteBuffer в соответствии с текущей платформой.

После того, как порядковый номер ByteBuffer правильно настроен, используйте ByteBuffer.asIntBuffer(), чтобы просмотреть его как java.nio.IntBuffer и заполнить его своими данными.

Полный пример :

import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer;

public class Test {
    static final int bytes_per_datum = 4;

    public static void main(String args[]) {
        main2("Native Endian", ByteOrder.nativeOrder());
        main2("Big Endian", ByteOrder.BIG_ENDIAN);
        main2("Little Endian", ByteOrder.LITTLE_ENDIAN);
    }

    static void main2(String comment, ByteOrder endian) {
        int[] data = { 1, 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF, 0xFFFFFFFF };
        ByteBuffer bb = ByteBuffer.allocateDirect(data.length * bytes_per_datum);
        bb.order(endian); // endian must be set before putting ints into the buffer
        put_ints(bb, data);

        System.out.println(comment + ": ");
        print(bb);
    }

    static void put_ints(ByteBuffer bb, int[] data) {
        IntBuffer b = bb.asIntBuffer(); // created IntBuffer starts only from the ByteBuffer's relative position
                                        // if you plan to reuse this IntBuffer, be mindful of its position
        b.put(data); // position of this IntBuffer changes by +data.length;
    } // this IntBuffer goes out of scope

    static void print(ByteBuffer bb) { // prints from start to limit
        ByteBuffer bb_2 = bb.duplicate(); // shares backing content, but has its own capacity/limit/position/mark (equivalent to original buffer at initialization)
        bb_2.rewind();
        for (int x = 0, xx = bb_2.limit(); x < xx; ++x) {
            System.out.print((bb_2.get() & 0xFF) + " "); // 0xFF for display, since java bytes are signed
            if ((x + 1) % bytes_per_datum == 0) {
                System.out.print(System.lineSeparator());
            }
        }
    }
}
2 голосов
/ 25 февраля 2012

вы можете преобразовать в матрицу следующим образом:

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

int[] arrayOfInt = {1,2,3,4,5,6};
byte[][] matrix = new byte[arrayOfInt.length][size];
for(int i=0;i<arrayOfInt.length;i++)
   byte[i] = intToByteArray(arrayOfInt[i]);
0 голосов
/ 25 февраля 2012

Любая причина, по которой массив int[] не передается напрямую в код C ++ или C с использованием JNI как в соответствии с примером, упомянутым здесь ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...