diff options
Diffstat (limited to 'chromium/base/android/apk_assets.cc')
-rw-r--r-- | chromium/base/android/apk_assets.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/chromium/base/android/apk_assets.cc b/chromium/base/android/apk_assets.cc new file mode 100644 index 00000000000..7a1b1d181f8 --- /dev/null +++ b/chromium/base/android/apk_assets.cc @@ -0,0 +1,55 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <jni.h> + +#include "base/android/apk_assets.h" + +#include "base/android/jni_array.h" +#include "base/android/jni_string.h" +#include "base/android/scoped_java_ref.h" +#include "base/base_jni_headers/ApkAssets_jni.h" +#include "base/file_descriptor_store.h" + +namespace base { +namespace android { + +int OpenApkAsset(const std::string& file_path, + const std::string& split_name, + base::MemoryMappedFile::Region* region) { + // The AssetManager API of the NDK does not expose a method for accessing raw + // resources :( + JNIEnv* env = base::android::AttachCurrentThread(); + ScopedJavaLocalRef<jlongArray> jarr = + Java_ApkAssets_open(env, ConvertUTF8ToJavaString(env, file_path), + ConvertUTF8ToJavaString(env, split_name)); + std::vector<jlong> results; + base::android::JavaLongArrayToLongVector(env, jarr, &results); + CHECK_EQ(3U, results.size()); + int fd = static_cast<int>(results[0]); + region->offset = results[1]; + // Not a checked_cast because open() may return -1. + region->size = static_cast<size_t>(results[2]); + return fd; +} + +int OpenApkAsset(const std::string& file_path, + base::MemoryMappedFile::Region* region) { + return OpenApkAsset(file_path, std::string(), region); +} + +bool RegisterApkAssetWithFileDescriptorStore(const std::string& key, + const base::FilePath& file_path) { + base::MemoryMappedFile::Region region = + base::MemoryMappedFile::Region::kWholeFile; + int asset_fd = OpenApkAsset(file_path.value(), ®ion); + if (asset_fd == -1) + return false; + base::FileDescriptorStore::GetInstance().Set(key, base::ScopedFD(asset_fd), + region); + return true; +} + +} // namespace android +} // namespace base |