JEP 412: передать массив байтов в куче в собственный код, получив исключение UnsupportedOperationException: не собственнJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JEP 412: передать массив байтов в куче в собственный код, получив исключение UnsupportedOperationException: не собственн

Сообщение Anonymous »

Все это есть в новом JDK 17.
Я пытаюсь превратить массив байтов в куче в MemorySegment и передать его встроенной функции. Я создал простой пример кода, который показывает это:

Код: Выделить всё

        final CLinker cLinker = CLinker.getInstance();

// int strlen(const char *str);
final Optional oSymbolAddress = CLinker.systemLookup().lookup("strlen");

final MethodHandle mh = cLinker.downcallHandle(oSymbolAddress.get(),
MethodType.methodType(int.class, MemoryAddress.class),
FunctionDescriptor.of(C_INT, C_POINTER));

out.println("I found this method handle: " + mh);
final byte[] ba = new byte[100];
ba[0] = 'h';
ba[1] = 'e';
ba[2] = 'l';
ba[3] = 'l';
ba[4] = 'o';
ba[5] = 0;

final MemorySegment stringSegment = MemorySegment.ofArray(ba);
final int result = (Integer) mh.invoke(stringSegment.address());

out.println("The length of the string is: " + result);
Он пытается запуститься, но выдает ошибку:

Код: Выделить всё

Exception in thread "main" java.lang.UnsupportedOperationException: Not a native address
at jdk.incubator.foreign/jdk.internal.foreign.MemoryAddressImpl.toRawLongValue(MemoryAddressImpl.java:91)
Если вместо использования MemorySegment.ofArray(ba) я использую это:

Код: Выделить всё

        final MemorySegment stringSegment = MemorySegment.allocateNative(100, newImplicitScope());
stringSegment.asByteBuffer().put(ba);
она работает и дает ожидаемый ответ (5).
Я поискал эту функцию в MemoryAddressImpl.java и вижу:

Код: Выделить всё

    @Override
public long toRawLongValue() {
if (segment != null) {
if (segment.base() != null) {
throw new UnsupportedOperationException("Not a native address");
}
segment.checkValidState();
}
return offset();
}
Очевидно, что сегмент.base() возвращает значение null.
Я не совсем понимаю, что происходит. Я думал, что одним из главных преимуществ Project Panama будет то, что собственный код сможет получить доступ к куче памяти, чтобы избежать необходимости копирования. Я, конечно, могу выполнить allocateNative(), а затем скопировать в него массив байтов, но я думаю, что этого копирования следует избегать.
Есть какие-нибудь идеи по этому поводу? Я делаю что-то не так или неправильно понимаю, как использовать кучную память?

Подробнее здесь: https://stackoverflow.com/questions/695 ... operatione
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»