2012-02-25 5 views
3

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

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

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

Edit: Пример кода:

Я раздели ненужные части. Я вызываю функцию Java над JNI из C++, чтобы загрузить ресурс и передать его обратно в C++ как bytebuffer. Он работает с различными другими ресурсами. Теперь у меня есть «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; 
} 
+0

Является ли это правильно? Я имею в виду, что ByteBuffer является абстрактным классом. Какой именно тип вам нужен? пожалуйста, укажите пример кода. –

ответ

5

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

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

После того, как endianness 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()); 
      } 
     } 
    } 
} 
+0

Привет, последняя строка дает ошибку «asIntBuffer не может быть разрешен или не является полем». – HardCoder

+0

Извините, моя ошибка. Я нахожусь в нем за 16 часов подряд и обязательно нуждаюсь в перерыве. Спасибо большое за вашу помощь. – HardCoder

+0

все еще вижу, что вы редактировали свой вопрос. Я не знаю точно, что вы на это, но если вам нужно загрузить PNG из C++, просто используйте замечательный std_image lib: http://nothings.org/stb_image.c –

2

можно преобразовать в матрицу таким образом:

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]); 
+1

Я ошибочно написал ByteArray, но имел в виду тип ByteBuffer. Но я действительно могу использовать то, что вы написали в другой части моего кода, так что спасибо вам большое. :-) – HardCoder

0

Любая причина не передавая int[] массив непосредственно в C++ или C код с помощью JNI в per the example mentioned here?

+0

Привет, спасибо за ваш ответ. Причина, по которой я не хочу ее менять, заключается в том, что у меня довольно много взаимодействий с JNI, и я всегда передаю ByteBuffer для передачи данных и хотел бы сохранить его таким образом. – HardCoder

Смежные вопросы