Я использую renderscript для обработки аудио dsp. Он работает хорошо, пока я не решил renderscriptTargetApi
версию renderscriptTargetApi
с 19 до 24, пытаясь использовать более новые API-интерфейсы renderscript обратно совместимым способом.
Нет никакой проблемы с компиляцией, но во время выполнения 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 failed: библиотека "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. Если я renderscriptTargetApi
версию, сборка все еще будет успешной, но файл librs.xx.so
не будет создан. Во время выполнения мы видим вышеупомянутую ошибку об этом.so файле.
Что мне здесь не хватает? Я пытался манипулировать своей minSdkVersion
которая, я думаю, не связана с renderscript target api. Это не помогло.
Как я могу использовать новые API-интерфейсы renderscript в обратной совместимости с NDK? Любая помощь приветствуется.
Repo воспроизвести проблему
https://github.com/rpattabi/renderscript-ndk-cmake
Я опубликовал отчет об ошибке в системе Android для сборки: https://issuetracker.google.com/issues/109578956