【问题标题】:OpenCL dlopen issueOpenCL dlopen 问题
【发布时间】:2018-07-05 07:20:03
【问题描述】:

我正在尝试在运行 Android 7.0 的三星上 dlopen /system/vendor/lib/libOpenCL.so,但我遇到了以前从未遇到过的错误:

E/链接器:库“/system/vendor/lib/libOpenCL.so”(“/system/vendor/lib/libOpenCL.so”)需要或被“/data/app/.../lib/命名空间无法访问 arm64/libCLProcessor.so": [name="classloader-namespace", ld_library_paths="", default_library_paths="..."])

它可以在另一个 android 7.0 设备 (Motorola G4) 上使用 libOpenCL.so 在同一目录中。

有人知道为什么它可以在一台设备上运行,而不能在另一台设备上运行吗?

我正在使用 https://github.com/krrishnarraj/libopencl-stub/blob/master/src/libopencl.c 中的代码来 dlopen/使用 cl 函数,它们我的 cl 内核在实际打开开放 cl 库的设备上运行良好。

【问题讨论】:

  • 另外,两个设备的 /vendor/etc/public.libraries.txt 文件中都列出了 libOpenCL.so。

标签: android opencl dlopen


【解决方案1】:

这个问题似乎是一个 Inforce 构建问题,因为 /libOpenCL.so 没有填充到 /system/etc/public.libraries.txt 中。

我能够通过编辑文件(添加 libOpenCL.so)在 Inforce 开发板上解决同样的问题。

【讨论】:

    【解决方案2】:

    Android 限制私有库访问,App 开发者无法访问该库。 Google Document

    如果你是应用开发者(我的意思是不能访问系统文件)。有两个解决方案:

    1. 使用公共 NDK API
    2. 包含它自己的这些库的副本。

    在这种情况下是 OpenCL,将库复制到您的应用中,或使用其他 API

    【讨论】:

      【解决方案3】:

      检查libOpenCL.so是否存在于/system/etc/public.libraries.txt

      如果没有,请在上面的文件中添加libOpenCL.so,然后您可以重新启动设备以使更改生效。

      【讨论】:

        【解决方案4】:

        在较新的 android 版本上,我的解决方法是将 libOpenCL.so 添加到:

        /vendor/etc/public.libraries.txt

        参考this SO post

        注意: 按照其他人的建议将其添加到 /system/etc/public.libraries.txt 会阻止设备启动

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-25
          • 2020-06-27
          • 2011-04-27
          • 2018-01-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多