Renderscript не генерирует librs.xx.so, если renderscriptTargetApi> 20 - программирование
Подтвердить что ты не робот

Renderscript не генерирует librs.xx.so, если renderscriptTargetApi> 20

Я использую 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

4b9b3361