native_library_mac.mm revision 731df977c0511bca2206b5f333555b1205ff1f43
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/mac/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 base::mac::ScopedCFTypeRef<CFURLRef> url( 31 CFURLCreateFromFileSystemRepresentation( 32 kCFAllocatorDefault, 33 (const UInt8*)library_path.value().c_str(), 34 library_path.value().length(), 35 true)); 36 if (!url) 37 return NULL; 38 CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get()); 39 if (!bundle) 40 return NULL; 41 42 NativeLibrary native_lib = new NativeLibraryStruct(); 43 native_lib->type = BUNDLE; 44 native_lib->bundle = bundle; 45 native_lib->bundle_resource_ref = CFBundleOpenBundleResourceMap(bundle); 46 return native_lib; 47} 48 49// static 50void UnloadNativeLibrary(NativeLibrary library) { 51 if (library->type == BUNDLE) { 52 CFBundleCloseBundleResourceMap(library->bundle, 53 library->bundle_resource_ref); 54 CFRelease(library->bundle); 55 } else { 56 dlclose(library->dylib); 57 } 58 delete library; 59} 60 61// static 62void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 63 const char* name) { 64 if (library->type == BUNDLE) { 65 base::mac::ScopedCFTypeRef<CFStringRef> symbol_name( 66 CFStringCreateWithCString(kCFAllocatorDefault, name, 67 kCFStringEncodingUTF8)); 68 return CFBundleGetFunctionPointerForName(library->bundle, symbol_name); 69 } 70 return dlsym(library->dylib, name); 71} 72 73// static 74string16 GetNativeLibraryName(const string16& name) { 75 return name + ASCIIToUTF16(".dylib"); 76} 77 78} // namespace base 79