Я использую Renderscript для обработки аудио DSP.Это работало хорошо, пока я не решил увеличить renderscriptTargetApi
версию с 19 до 24, пытаясь использовать более новые API-интерфейсы для отрисовки в обратно совместимом виде.
Нет проблем с компиляцией, но во время выполнения logcat показывает такую ошибку
05-31 19: 40: 23.097 8661-8734 / com.example.audio.test E / RenderScript: невозможно открыть общую библиотеку (/data/user/0/com.example.audio.test//lib/librs.xx.so): сбой dlopen: библиотека "libRSSupportIO.so" не найдена
Если у меня renderscriptTargetApi
как 19 или 20, мой apk имеет librs.xx.so
и ошибки нет.Если я увеличу его до 21, 23 или 24, librs.xx.so
не будет сгенерирован, и, таким образом, у меня возникнет эта ошибка во время выполнения.
Я использую Renderscript через NDK, то есть C ++.Также с помощью CMake.Нет инструкций, которые я мог бы найти, чтобы использовать библиотеку поддержки Renderscript через NDK.Все инструкции предполагают, что библиотека поддержки используется через Java.
Это из build.gradle
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
renderscriptTargetApi 24
renderscriptSupportModeEnabled true
renderscriptNdkModeEnabled true
CMakeLists.txt
имеет
add_library (dsp SHARED
${SRC_PATH}/dsp.cpp
${SRC_RS_PATH}/xx.rs ${SRC_RS_GENERATED_PATH}/ScriptC_xx.cpp)
target_compile_options(dsp PRIVATE
-std=c++11 -stdlib=libc++ -fno-rtti -fexceptions -Ofast)
target_link_libraries(dsp RScpp_static dl ${log-lib})
Это xx.rs
#pragma version(1)
#pragma rs java_package_name(com.example.audio)
#pragma rs_fp_relaxed
float RS_KERNEL my_kernel(float in, uint32_t x) {
// ...
}
Так ядро вызывается из C ++
sp<RS> rs = new RS();
rs->init(app_cache_dir);
sp<const Element> e = Element::F32(rs);
sp<const Type> t = Type::create(rs, e, 44100*10, 0, 0);
sp<Allocation> inAlloc = Allocation::createTyped(rs, t);
inAlloc->copy1DFrom(input);
sp<Allocation> outAlloc = Allocation::createTyped(rs, t);
ScriptC_xx *script = new ScriptC_xx(rs);
script->forEach_xx(inAlloc, outAlloc);
outAlloc->copy1DTo(output);
Как видите, это довольно простой сценарий использования Renderscript.Он хорошо работает с renderscriptTargetApi
в 19 или 20. Если я увеличу версию, сборка все равно будет успешной, но файл librs.xx.so
не будет создан.Во время выполнения мы видим вышеупомянутую ошибку об этом .so файле.
Что мне здесь не хватает?Я пытался манипулировать своим minSdkVersion
, который, как мне кажется, не связан с рендерингом target api.Это не помогло.
Как я могу использовать более новые API визуализации с обратной совместимостью из NDK?Любая помощь приветствуется.
Репо для воспроизведения проблемы
https://github.com/rpattabi/renderscript-ndk-cmake
Я отправил сообщение об ошибке в системе сборки Android по этому поводу: https://issuetracker.google.com/issues/109578956