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

0 ответов

Другие вопросы по тегам