Load libRS_internal.so from the rs namespace

am: 0f70905b7d

Change-Id: I93ca1cc807eeb71473bcc3838e6f61d40c3ebc6b
This commit is contained in:
Jiyong Park
2017-10-30 03:29:06 +00:00
committed by android-build-merger

View File

@@ -1,6 +1,9 @@
#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,