aar/apk 中的 RenderScript 本机库

RenderScript native library in aar/apk

我正在尝试解决此问题:

E/RenderScript: 无法打开共享库 (/data/user_de/0/com.xxxx/code_cache/com.android.renderscript.cache/librs.yuv2rgbframes.so): (空)

我已经按照文档的说明在 build.gradle 中设置了渲染脚本:

android {
    ...
    defaultConfig {
        ...
        renderscriptTargetApi 18
        renderscriptSupportModeEnabled true
    }
}

起初我以为是因为 renderscript 本身在另一个模块中(它生成了一个由应用程序项目链接的 .aar),但这似乎不是问题所在。我尝试将以上内容同时放入 .aar 模块和应用程序模块 - 没有区别。

我的下一步是查看 .aar 和 .apk 的内容,这导致了我的问题:我应该能够在某处看到生成的 .so 文件吗?我希望看到一个用于 arm7 的 .so 和另一个用于 x86 的 .so,但是没有。

有一些关于此的问题,但它们不是一回事。但我这里的主要问题与我如何解决这个问题有关:这个 .so 文件在哪里结束。我认为这些工具实际上必须设置好,因为它成功地为渲染脚本生成了 java 存根....

...

编辑:也许我误解了这里发生的事情。在我粘贴的错误之后还有两条消息:

E/RenderScript: Unable to open shared library (/data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/librs.yuv2rgbframes.so): (null) V/RenderScript: Invoking /system/bin/bcc with args '/system/bin/bcc -unroll-runtime -scalarize-load-store -rs-global-info -rs-global-info-skip-constant -o yuv2rgbframes -output_path /data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache -bclib /system/lib64/libclcore.bc -mtriple aarch64-none-linux-gnueabi -O 3 -aarch64-fix-cortex-a53-835769 -load libbccQTI.so -fPIC -embedRSInfo /data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/yuv2rgbframes.bc -build-checksum abadcafe' V/RenderScript: Invoking /system/bin/ld.mc with args '/system/bin/ld.mc -shared -nostdlib /system/lib64/libcompiler_rt.so -mtriple=aarch64-none-linux-gnueabi --library-path=/system/vendor/lib64 --library-path=/system/lib64 -lRSDriver_adreno -lm -lc /data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/yuv2rgbframes.o -o /data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/librs.yuv2rgbframes.so'

它真的会在平台上生成 .so 吗?

是的,Renderscript 代码是根据其内部位码格式在目标上编译的。这样做是因为每个 Android 设备都不同,并且以不同的方式支持 RS。非常基本的平台将提供一个 CPU "driver" 层,它只会利用 CPU 来完成 RS 工作(使用多线程)。在这种情况下,您的 RS 位码被编译成本机代码。大多数现代 Android 平台将利用 GPU 或板载 DSP。在这种情况下,您的特定 RS 代码的位码是 "compiled" 到 GPU/DSP 指令中,RS 的平台 "driver" 层会将您的 RS 操作卸载到 GPU/DSP.

本次演讲提供了一些有关其工作原理的信息,希望能为您提供一些有用的信息:https://youtu.be/3ynA92x8WQo