// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #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 jarr = Java_ApkAssets_open(env, ConvertUTF8ToJavaString(env, file_path), ConvertUTF8ToJavaString(env, split_name)); std::vector results; base::android::JavaLongArrayToLongVector(env, jarr, &results); CHECK_EQ(3U, results.size()); int fd = static_cast(results[0]); region->offset = results[1]; // Not a checked_cast because open() may return -1. region->size = static_cast(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