Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05973811 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Load libRS_internal.so from the rs namespace" into oc-mr1-dev

parents 5a9c0c31 a7ef697a
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
#include "Context.h"
#include "Device.h"

#include <android/dlext.h>
#include <dlfcn.h>

namespace android {
namespace hardware {
namespace renderscript {
@@ -39,7 +42,25 @@ dispatchTable loadHAL() {
    static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)");

    const char* filename = "libRS_internal.so";
    void* handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
    // Try to load libRS_internal.so from the "rs" namespace directly.
    typedef struct android_namespace_t* (*GetExportedNamespaceFnPtr)(const char*);
    GetExportedNamespaceFnPtr getExportedNamespace =
        (GetExportedNamespaceFnPtr)dlsym(RTLD_DEFAULT, "android_get_exported_namespace");
    void* handle = nullptr;
    if (getExportedNamespace != nullptr) {
        android_namespace_t* rs_namespace = getExportedNamespace("rs");
        if (rs_namespace != nullptr) {
            const android_dlextinfo dlextinfo = {
                .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = rs_namespace,
            };
            handle = android_dlopen_ext(filename, RTLD_LAZY | RTLD_LOCAL, &dlextinfo);
        }
    }
    if (handle == nullptr) {
        // if there is no "rs" namespace (in case when this HAL impl is loaded
        // into a vendor process), then use the plain dlopen.
        handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
    }

    dispatchTable dispatchHal = {
        .SetNativeLibDir = (SetNativeLibDirFnPtr) nullptr,