Как получить доступ к внутреннему `byte []` of `java.lang.string` на современном Android/Art, когда не удается отражениеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить доступ к внутреннему `byte []` of `java.lang.string` на современном Android/Art, когда не удается отражение

Сообщение Anonymous »

Я пытаюсь получить прямой, нулевой доступ к внутреннему массиву байтов java.lang.string для критической задачи на Android. Например, следующий код работает, как и ожидалось, и предоставляет доступ: < /p>

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

// This code works on a standard OpenJDK JVM
try {
String testString = "Hello, OpenJDK!";
Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
byte[] value = (byte[]) valueField.get(testString);
System.out.println("OpenJDK: Successfully accessed 'value' field.");
} catch (Exception e) {
e.printStackTrace();
}
< /code>
Однако этот тот же подход не работает на современных устройствах Android, работающих во время выполнения искусства. Это приводит к моим основным вопросам:

  [b] Какова новая внутренняя реализация java.lang.string 
в современном времени выполнения Android (Art)? Были ли эти данные полностью перемещены на нативную сторону C ++ во время выполнения? /> < /ol>
Моя конечная цель состоит в том, чтобы избежать копий памяти во время чувствительных к производительности операций анализа. Class = "Lang-Java PrettyPrint-Override">

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

// This code fails on modern Android
try {
String testString = "Hello, ART!";
Field valueField = String.class.getDeclaredField("value"); // This line throws
valueField.setAccessible(true);
// ...
} catch (NoSuchFieldException e) {
// This exception is caught
Log.e("StringReflection", "Failed to find 'value' field", e);
}
What I expected:[/b]
I expected this code to execute successfully and give me a Field object corresponding to the internal value array of the String, allowing me to read its contents directly.
What actually resulted:
The Код бросил java.lang.nosuchfieldexception в строке GetDeclaredField ("value") . Полное сообщение об ошибке: < /p>

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

java.lang.NoSuchFieldException: No field value in class Ljava/lang/String; (declaration of 'java.lang.String' appears in /apex/com.android.art/javalib/core-oj.jar)
В качестве дальнейшего шага отладки я попытался сбросить все объявленные поля класса строки на устройстве и подтвердил, что значения и Coder действительно нет.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ndroid-art
Ответить

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

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

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

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

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