Использование памяти, выделенной sun.misc.Unsafe.allocateMemory () в собственном коде - PullRequest
4 голосов
/ 17 февраля 2012

Я пытаюсь выделить память с помощью sun.misc.Unsafe.allocateMemory () и получить доступ к ней в собственном коде.

однако, похоже, что длинное значение, возвращаемое allocateMemory, не совсем работает как правильный адрес в коде C.

            Unsafe unsafe = getUnsafe();
            long address = unsafe.allocateMemory(64);

            for (int i = 0; i < 64; i += 8)
                unsafe.putByte(memory + i, (byte) 0xFF);

            nativeMethod(address);

Однако в моем родном коде, когда я пытаюсь получить доступ к «адресу» в качестве указателя, он не работает: (

Обновление: Я приложил изображение, показывающее проблему. Я передал «адрес» нативному коду, однако, проверка памяти в этом месте не показывает значения 0xFF, которые я там ввел.

Изображение: http://i.stack.imgur.com/KoIYG.png

enter image description here

1 Ответ

11 голосов
/ 17 февраля 2012

Я думаю, что это работает отлично!Ваш цикл for устанавливает каждый восьмой байт на 0xff, и если вы внимательно посмотрите на дисплей и посчитаете, вы увидите, что каждый восьмой байт равен 0xff.Там есть некоторые другие случайные значения, потому что Unsafe. allocateMemory() не возвращает обнуленную память;он возвращает неинициализированную память, точно так же как C malloc().

Если вы изменили это "i + = 8" на просто "i ++", то каждый байт будет 0xff;стоило бы провести этот эксперимент, чтобы доказать себе, что он работает.

...