diff options
author | Michael Hoisie <hoisie@google.com> | 2024-03-18 23:53:30 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-03-18 23:53:30 +0000 |
commit | d3a8d904f4f8fa46b96913cdb5963298c4e30320 (patch) | |
tree | 1e923a762e55eb387d67a31c41b4b1c7b669ce93 | |
parent | 8c6a9a737eeb6179245c5bdb56e8e23bd9e35a66 (diff) | |
parent | b966c2946af50ad4c51ef223cd7224471852dfdd (diff) | |
download | base-d3a8d904f4f8fa46b96913cdb5963298c4e30320.tar.gz |
Merge "Add support for sqlite JNI in Windows" into android12-hostruntime-dev
-rw-r--r-- | core/jni/Android.bp | 18 | ||||
-rw-r--r-- | core/jni/RobolectricNativeRuntime.cpp | 4 | ||||
-rw-r--r-- | core/jni/android_database_SQLiteConnection.cpp | 14 | ||||
-rw-r--r-- | libs/androidfw/Android.bp | 7 | ||||
-rw-r--r-- | libs/androidfw/CursorWindow.cpp | 21 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/CursorWindow.h | 7 |
6 files changed, 35 insertions, 36 deletions
diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 3003b7be58c1..f3fb0ed8f925 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -424,15 +424,6 @@ cc_library_shared { dir: "robolectric/nativeruntime/windows", }, }, - not_windows: { - srcs: [ - "android_database_CursorWindow.cpp", - "android_database_SQLiteCommon.cpp", - "android_database_SQLiteConnection.cpp", - "android_database_SQLiteGlobal.cpp", - "android_database_SQLiteDebug.cpp", - ], - }, windows: { enabled: true, }, @@ -445,10 +436,15 @@ cc_library_shared { ], srcs: [ "android_animation_PropertyValuesHolder.cpp", - "libcore_util_NativeAllocationRegistry.cpp", + "android_database_CursorWindow.cpp", + "android_database_SQLiteCommon.cpp", + "android_database_SQLiteConnection.cpp", + "android_database_SQLiteGlobal.cpp", + "android_database_SQLiteDebug.cpp", "android_util_Log.cpp", - "com_android_internal_util_VirtualRefBasePtr.cpp", "android_view_Surface.cpp", + "com_android_internal_util_VirtualRefBasePtr.cpp", + "libcore_util_NativeAllocationRegistry.cpp", "RobolectricNativeRuntime.cpp", // Utilized to get rendered result pixels ":libmedia_host_common", diff --git a/core/jni/RobolectricNativeRuntime.cpp b/core/jni/RobolectricNativeRuntime.cpp index a597520162b6..d11a4b71ecef 100644 --- a/core/jni/RobolectricNativeRuntime.cpp +++ b/core/jni/RobolectricNativeRuntime.cpp @@ -27,10 +27,8 @@ extern int register_android_media_ImageReader(JNIEnv* env); namespace android { extern int register_android_animation_PropertyValuesHolder(JNIEnv* env); -#ifndef _WIN32 extern int register_android_database_CursorWindow(JNIEnv* env); extern int register_android_database_SQLiteConnection(JNIEnv* env); -#endif extern int register_android_view_Surface(JNIEnv* env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv* env); @@ -41,10 +39,8 @@ struct RegJNIRec { }; static const RegJNIRec sqliteJNI[] = { -#ifndef _WIN32 REG_JNI(register_android_database_CursorWindow), REG_JNI(register_android_database_SQLiteConnection), -#endif }; static const RegJNIRec graphicsJNI[] = { diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp index 32697aeaa47f..63ad713a8429 100644 --- a/core/jni/android_database_SQLiteConnection.cpp +++ b/core/jni/android_database_SQLiteConnection.cpp @@ -16,16 +16,16 @@ #define LOG_TAG "SQLiteConnection" -#include <jni.h> -#include <nativehelper/JNIHelp.h> +#include <android-base/mapped_file.h> #include <android_runtime/AndroidRuntime.h> #include <android_runtime/Log.h> +#include <jni.h> +#include <nativehelper/JNIHelp.h> #include <utils/Log.h> #include <utils/String8.h> #include <utils/String16.h> #include <cutils/ashmem.h> -#include <sys/mman.h> #include <string.h> #include <unistd.h> @@ -606,13 +606,13 @@ static int createAshmemRegionWithData(JNIEnv* env, const void* data, size_t leng ALOGE("ashmem_create_region failed: %s", strerror(error)); } else { if (length > 0) { - void* ptr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (ptr == MAP_FAILED) { + std::unique_ptr<base::MappedFile> mappedFile = + base::MappedFile::FromFd(fd, 0, length, PROT_READ | PROT_WRITE); + if (!mappedFile) { error = errno; ALOGE("mmap failed: %s", strerror(error)); } else { - memcpy(ptr, data, length); - munmap(ptr, length); + memcpy(mappedFile->data(), data, length); } } diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp index d4eaf2fa9b4a..90b360f0f1d5 100644 --- a/libs/androidfw/Android.bp +++ b/libs/androidfw/Android.bp @@ -62,6 +62,7 @@ cc_library { "AttributeResolution.cpp", "ChunkIterator.cpp", "ConfigDescription.cpp", + "CursorWindow.cpp", "Idmap.cpp", "LoadedArsc.cpp", "Locale.cpp", @@ -87,7 +88,6 @@ cc_library { srcs: [ "BackupData.cpp", "BackupHelpers.cpp", - "CursorWindow.cpp", ], shared_libs: [ "libbase", @@ -118,11 +118,6 @@ cc_library { "libz", ], }, - not_windows: { - srcs: [ - "CursorWindow.cpp", - ], - }, windows: { enabled: true, }, diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 984a6a91edd8..6b2c9b28fb72 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -18,11 +18,12 @@ #include <androidfw/CursorWindow.h> -#include <sys/mman.h> - #include "android-base/logging.h" +#include "android-base/mapped_file.h" #include "cutils/ashmem.h" +using android::base::MappedFile; + namespace android { /** @@ -39,7 +40,7 @@ CursorWindow::CursorWindow() { CursorWindow::~CursorWindow() { if (mAshmemFd != -1) { - ::munmap(mData, mSize); + mMappedFile.reset(); ::close(mAshmemFd); } else { free(mData); @@ -75,6 +76,7 @@ fail_silent: status_t CursorWindow::maybeInflate() { int ashmemFd = 0; void* newData = nullptr; + std::unique_ptr<MappedFile> mappedFile; // Bail early when we can't expand any further if (mReadOnly || mSize == mInflatedSize) { @@ -95,11 +97,12 @@ status_t CursorWindow::maybeInflate() { goto fail_silent; } - newData = ::mmap(nullptr, mInflatedSize, PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0); - if (newData == MAP_FAILED) { + mappedFile = MappedFile::FromFd(ashmemFd, 0, mInflatedSize, PROT_READ | PROT_WRITE); + if (!mappedFile) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } + newData = mappedFile->data(); if (ashmem_set_prot_region(ashmemFd, PROT_READ) < 0) { PLOG(ERROR) << "Failed ashmem_set_prot_region"; @@ -120,6 +123,7 @@ status_t CursorWindow::maybeInflate() { mData = newData; mSize = mInflatedSize; mSlotsOffset = newSlotsOffset; + mMappedFile = std::move(mappedFile); updateSlotsData(); } @@ -130,7 +134,7 @@ status_t CursorWindow::maybeInflate() { fail: LOG(ERROR) << "Failed maybeInflate"; fail_silent: - ::munmap(newData, mInflatedSize); + mappedFile.reset(); ::close(ashmemFd); return UNKNOWN_ERROR; } @@ -168,11 +172,12 @@ status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outWindow goto fail_silent; } - window->mData = ::mmap(nullptr, window->mSize, PROT_READ, MAP_SHARED, window->mAshmemFd, 0); - if (window->mData == MAP_FAILED) { + window->mMappedFile = MappedFile::FromFd(window->mAshmemFd, 0, window->mSize, PROT_READ); + if (!window->mMappedFile) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } + window->mData = window->mMappedFile->data(); } else { window->mAshmemFd = -1; diff --git a/libs/androidfw/include/androidfw/CursorWindow.h b/libs/androidfw/include/androidfw/CursorWindow.h index 6e55a9a0eb8b..f91214a37b11 100644 --- a/libs/androidfw/include/androidfw/CursorWindow.h +++ b/libs/androidfw/include/androidfw/CursorWindow.h @@ -22,8 +22,11 @@ #include <stdint.h> #include <string> +#include "android-base/mapped_file.h" #include "android-base/stringprintf.h" +#ifdef __ANDROID__ #include "binder/Parcel.h" +#endif #include "utils/String8.h" #define LOG_WINDOW(...) @@ -80,9 +83,11 @@ public: ~CursorWindow(); static status_t create(const String8& name, size_t size, CursorWindow** outCursorWindow); +#ifdef __ANDROID__ static status_t createFromParcel(Parcel* parcel, CursorWindow** outCursorWindow); status_t writeToParcel(Parcel* parcel); +#endif inline String8 name() { return mName; } inline size_t size() { return mSize; } @@ -146,6 +151,8 @@ private: String8 mName; int mAshmemFd = -1; void* mData = nullptr; + std::unique_ptr<android::base::MappedFile> mMappedFile; + /** * Pointer to the first FieldSlot, used to optimize the extremely * hot code path of getFieldSlot(). |