Android aar/apk中的RenderScript本机库

Android aar/apk中的RenderScript本机库,android,renderscript,android-renderscript,Android,Renderscript,Android Renderscript,我正在尝试对此进行故障排除: E/RenderScript:无法打开共享库/data/user_de/0/com.xxxx/code_cache/com.android.RenderScript.cache/librs.yuv2rgbframes.so:null 我已按照文档说明在build.gradle中设置了renderscript: android { ... defaultConfig { ... renderscriptTargetApi

我正在尝试对此进行故障排除:

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

我已按照文档说明在build.gradle中设置了renderscript:

android {
    ...
    defaultConfig {
        ...
        renderscriptTargetApi 18
        renderscriptSupportModeEnabled true
    }
}
起初我认为这是因为renderscript本身位于另一个模块中,该模块生成一个.aar,由应用程序项目链接进来,但这似乎不是问题所在。我尝试将上述内容同时放入.aar模块和应用程序模块中-没有区别

我的下一步是查看.aar和.apk的内容,这引出了我的问题:我是否应该能够在那里的某个地方看到生成的.so文件?我希望看到一个.so用于arm7,另一个用于x86,但没有

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

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

E/RenderScript:无法打开共享库 /data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/librs.yuv2rgbframes.so: null V/RenderScript:使用args调用/system/bin/bcc '/system/bin/bcc-unroll runtime-scalarize load store-rs global info -rs全局信息跳过常量-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-o3-aarch64-fix-cortex-a53-835769-load libbccQTI.so-fPIC-embeddersinfo/data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/yuv2rgbframes.bc -生成校验和abadcafe'V/RenderScript:使用args'/system/bin/ld.mc-shared-nostlib调用/system/bin/ld.mc /system/lib64/libcompiler_rt.so-mtriple=aarch64 none-linux-gnueabi -library path=/system/vendor/lib64-library path=/system/lib64-lRSDriver\u adreno-lm-lc/data/user\u de/0/com.xxx.powerscan/code\u cache/com.android.renderscript.cache/yuv2rgframes.o -o/data/user_de/0/com.xxx.powerscan/code_cache/com.android.renderscript.cache/librs.yuv2rgbframes.so'


它真的生成了吗?那么在平台上呢?

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


这篇演讲介绍了一些这方面的工作原理,希望能为您提供一些有用的信息:

有趣的是,在我的项目目录中,我发现了一个包含一些.java文件的目录build/generated/renderscript\u source\u output\u dir。其中一个包含一个静态byte[]方法,它只是一组数字——我猜是实际编译的renderscript。你能解决这个问题吗?我正在开发一个库,并考虑在renderscript中实现一些逻辑,以使其可重用。我做到了,我最终得到了一个构建并运行的项目。不过,我还是觉得工具有点脆。一般来说,虽然这个过程确实有效——您编写代码,但它会为各种平台和体系结构生成本机库。如果其中一个不匹配,我想它会通过某种解释器运行代码,因此速度会很慢,但仍然可以工作。非常感谢您共享该视频的链接。