native_library_mac.mm revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/native_library.h" 6 7#include <dlfcn.h> 8#import <Carbon/Carbon.h> 9 10#include "base/file_path.h" 11#include "base/file_util.h" 12#include "base/scoped_cftyperef.h" 13#include "base/string_util.h" 14#include "base/utf_string_conversions.h" 15 16namespace base { 17 18// static 19NativeLibrary LoadNativeLibrary(const FilePath& library_path) { 20 if (library_path.Extension() == "dylib" || 21 !file_util::DirectoryExists(library_path)) { 22 void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY); 23 if (!dylib) 24 return NULL; 25 NativeLibrary native_lib = new NativeLibraryStruct(); 26 native_lib->type = DYNAMIC_LIB; 27 native_lib->dylib = dylib; 28 return native_lib; 29 } 30 scoped_cftyperef<CFURLRef> url(CFURLCreateFromFileSystemRepresentation( 31 kCFAllocatorDefault, 32 (const UInt8*)library_path.value().c_str(), 33 library_path.value().length(), 34 true)); 35 if (!url) 36 return NULL; 37 CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get()); 38 if (!bundle) 39 return NULL; 40 41 NativeLibrary native_lib = new NativeLibraryStruct(); 42 native_lib->type = BUNDLE; 43 native_lib->bundle = bundle; 44 native_lib->bundle_resource_ref = CFBundleOpenBundleResourceMap(bundle); 45 return native_lib; 46} 47 48// static 49void UnloadNativeLibrary(NativeLibrary library) { 50 if (library->type == BUNDLE) { 51 CFBundleCloseBundleResourceMap(library->bundle, 52 library->bundle_resource_ref); 53 CFRelease(library->bundle); 54 } else { 55 dlclose(library->dylib); 56 } 57 delete library; 58} 59 60// static 61void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 62 const char* name) { 63 if (library->type == BUNDLE) { 64 scoped_cftyperef<CFStringRef> symbol_name( 65 CFStringCreateWithCString(kCFAllocatorDefault, name, 66 kCFStringEncodingUTF8)); 67 return CFBundleGetFunctionPointerForName(library->bundle, symbol_name); 68 } 69 return dlsym(library->dylib, name); 70} 71 72// static 73string16 GetNativeLibraryName(const string16& name) { 74 return name + ASCIIToUTF16(".dylib"); 75} 76 77} // namespace base 78