Как использовать InMemoryDexClassLoader?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как использовать InMemoryDexClassLoader?

Сообщение Anonymous »

Мне хотелось бы иметь возможность запускать в памяти код, не установленный как часть приложения. Я предположил, что InMemoryDexClassLoader был создан именно для этого, поэтому попробовал использовать его для выполнения метода в том же приложении (даже в том же классе), но из памяти. Для этого я загружаю сам APK в буфер и передаю этот буфер в InMemoryDexClassLoader. Однако я получаю исключение ClassNotFoundException.

public class Test {
public void loadSelf(Context c) {
try {
FileInputStream fis = new FileInputStream(c.getApplicationInfo().publicSourceDir);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bytesRead;
byte[] buffer = new byte[1024];
while ((bytesRead = fis.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, bytesRead);
}
baos.flush();
byte[] dex = baos.toByteArray();
ByteBuffer bb = ByteBuffer.allocate(dex.length);
bb.put(dex);
bb.position(0);
ClassLoader loader = new InMemoryDexClassLoader(bb, null);
Class thisClass = loader.loadClass(this.getClass().getName()); //ClassNotFoundException
Method method = thisClass.getMethod("sayHi", Context.class);
method.invoke(thisClass.newInstance(), c);
bb.clear();
return;
} catch (Exception e) {
e.printStackTrace();
}
}

public void sayHi(Context c) {
Toast.makeText(c, "Hi!", Toast.LENGTH_LONG).show();
}
}


То же самое с DexClassLoader работает отлично! Кто-нибудь может понять, в чем дело?

//This works fine and shows the Toast
public class Test {
public void loadSelf(Context c) {
try {
ClassLoader loader = new DexClassLoader(c.getApplicationInfo().publicSourceDir, null, null, null);
Class thisClass = loader.loadClass(this.getClass().getName());
Method method = thisClass.getMethod("sayHi", Context.class);
method.invoke(thisClass.newInstance(), c);
return;
} catch (Exception e) {
e.printStackTrace();
}
}

public void sayHi(Context c) {
Toast.makeText(c, "Hi!", Toast.LENGTH_LONG).show();
}
}


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

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

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

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

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

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