1441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker/*
2441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Copyright (C) 2013 The Android Open Source Project
3441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
4441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
5441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * you may not use this file except in compliance with the License.
6441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * You may obtain a copy of the License at
7441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
8441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
9441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
10441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Unless required by applicable law or agreed to in writing, software
11441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
12441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * See the License for the specific language governing permissions and
14441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * limitations under the License.
15441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker */
16441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
17441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//#define LOG_NDEBUG 0
18441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#define LOG_TAG "Drm"
19441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <utils/Log.h>
20441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h>
21441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
22441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <dlfcn.h>
23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include "SharedLibrary.h"
25441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
26441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkernamespace android {
27441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
28441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    SharedLibrary::SharedLibrary(const String8 &path) {
29441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        mLibHandle = dlopen(path.string(), RTLD_NOW);
30441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
31441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
32441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    SharedLibrary::~SharedLibrary() {
33441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        if (mLibHandle != NULL) {
34441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            dlclose(mLibHandle);
35441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            mLibHandle = NULL;
36441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
37441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
38441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
39441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    bool SharedLibrary::operator!() const {
40441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return mLibHandle == NULL;
41441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
42441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
43441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    void *SharedLibrary::lookup(const char *symbol) const {
44441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        if (!mLibHandle) {
45441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return NULL;
46441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
47441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return dlsym(mLibHandle, symbol);
48441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
49d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com
50d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com    const char *SharedLibrary::lastError() const {
51d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com        const char *error = dlerror();
52d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com        return error ? error : "No errors or unknown error";
53d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com    }
54d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com
55441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
56