Существует какая-то загадочная проблема с созданием объекта ScriptC при использовании RenderScript. Вот мой код:
public class RenderScriptActivity {
private RenderScript mRS;
private ScriptC_kernel mScript = null;
private Allocation m1Allocation, m2Allocation,
m3Allocation, m4Allocation;
private Bitmap mBitmap;
private ImageView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_renderscript);
mView = (ImageView) findViewById(R.id.image_view);
}
@Override
protected void onResume() {
super.onResume();
initRenderScript();
}
@Override
protected void onPause() {
super.onPause();
releaseRenderScript();
}
private void initRenderScript() {
mRS = RenderScript.create(this);
int size = 320*240;
m1Allocation = Allocation.createSized(mRS, Element.I16(mRS), size);
m2Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
m3Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
mBitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
m4Allocation = Allocation.createFromBitmap(mRS, mBitmap);
mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);
}
private void releaseRenderScript() {
m1Allocation.destroy();
m2Allocation.destroy();
m3Allocation.destroy();
m4Allocation.destroy();
// mScript.destroy();
mRS.finish();
}
}
И мое ядро (да, оно пустое):
#pragma version(1)
#pragma rs java_package_name(com.example.android.myrenderscript)
Проблема в том, что после 3-го вызова функции initRenderScript()
(т. е. возобновления работы приложения, приостановки, возобновления, приостановки и повторного возобновления) мое приложение аварийно завершает работу (SIGSEV) с ошибкой:
backtrace:
#00 pc 00027034 /system/lib/libRS.so (android::renderscript::rsrClearObject(android::renderscript::Context const*, android::renderscript::ObjectBase**)+3)
#01 pc 00012c3b /system/lib/libRSDriver.so
#02 pc 00000668 <unknown>
Кроме того, если я использую метод mScript.destory()
(который прокомментирован выше), мое приложение вылетает сразу после первого вызова initRenderScript()
. Кроме того, если я просто прокомментирую строку, которая создает объект ScriptC_kernel
, все будет работать нормально. Вот почему я полагаю, это проблема с созданием объекта ScriptC
.
Есть ли шанс, кто-нибудь знает, почему эта проблема возникает?
Что здесь любопытно, эта проблема возникает, только если я создаю приложение из командной строки (с командой ant debug
, Ubuntu 14.04). Когда я создаю его с помощью Android Studio или Eclipse, все работает нормально.
Я также должен упомянуть, что на самом деле падает не само приложение (оно содержит несколько действий), а один поток, который, я полагаю, является RenderScript. После сбоя предыдущая активность снова выводится на передний план.
Буду очень признателен за любую помощь, и заранее спасибо
mRS.finish()
вызывать перед уничтожением выделений? Дождитесь завершения любых ожидающих асинхронных операций (таких как копирование в выделение RS или выполнение сценария RS) ... давайте предположим, что есть какая-то ожидающая асинхронная операция, и вы уничтожаете выделение ... что может случиться если эта операция завершится? ... также я вижу еще одну проблему с этим кодом ... вы создаете растровое изображение для каждого резюме ... и не выпускаете его ... рано или поздно это закончится исключением OOMemory - person Selvin   schedule 05.01.2016