Renderscript не создает librs.xx.so, если renderscriptTargetApi > 20
Я использую 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
который я думаю не имеет отношения к Renderscript целевой API. Это не помогло.
Как я могу использовать более новые API-интерфейсы рендеринга с обратной совместимостью от NDK? Любая помощь приветствуется.
Репо, чтобы воспроизвести проблему
https://github.com/rpattabi/renderscript-ndk-cmake
Я отправил отчет об ошибке в системе сборки Android об этом: https://issuetracker.google.com/issues/109578956