1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <jni.h> 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/apk_assets.h" 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/context_utils.h" 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_array.h" 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_string.h" 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/scoped_java_ref.h" 13cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#include "base/file_descriptor_store.h" 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "jni/ApkAssets_jni.h" 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace base { 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace android { 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezint OpenApkAsset(const std::string& file_path, 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::MemoryMappedFile::Region* region) { 21cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli // The AssetManager API of the NDK does not expose a method for accessing raw 22cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli // resources :( 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez JNIEnv* env = base::android::AttachCurrentThread(); 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_open( 25cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli env, base::android::GetApplicationContext(), 26cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli base::android::ConvertUTF8ToJavaString(env, file_path)); 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<jlong> results; 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::android::JavaLongArrayToLongVector(env, jarr.obj(), &results); 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez CHECK_EQ(3U, results.size()); 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int fd = static_cast<int>(results[0]); 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez region->offset = results[1]; 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez region->size = results[2]; 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return fd; 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 36cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civellibool RegisterApkAssetWithFileDescriptorStore(const std::string& key, 37cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli const base::FilePath& file_path) { 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::MemoryMappedFile::Region region = 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::MemoryMappedFile::Region::kWholeFile; 40cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli int asset_fd = OpenApkAsset(file_path.value(), ®ion); 41cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli if (asset_fd == -1) 42cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli return false; 43cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli base::FileDescriptorStore::GetInstance().Set(key, base::ScopedFD(asset_fd), 44cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli region); 45cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli return true; 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace android 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace base 50