summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@google.com>2024-03-18 23:53:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-03-18 23:53:30 +0000
commitd3a8d904f4f8fa46b96913cdb5963298c4e30320 (patch)
tree1e923a762e55eb387d67a31c41b4b1c7b669ce93
parent8c6a9a737eeb6179245c5bdb56e8e23bd9e35a66 (diff)
parentb966c2946af50ad4c51ef223cd7224471852dfdd (diff)
downloadbase-d3a8d904f4f8fa46b96913cdb5963298c4e30320.tar.gz
Merge "Add support for sqlite JNI in Windows" into android12-hostruntime-dev
-rw-r--r--core/jni/Android.bp18
-rw-r--r--core/jni/RobolectricNativeRuntime.cpp4
-rw-r--r--core/jni/android_database_SQLiteConnection.cpp14
-rw-r--r--libs/androidfw/Android.bp7
-rw-r--r--libs/androidfw/CursorWindow.cpp21
-rw-r--r--libs/androidfw/include/androidfw/CursorWindow.h7
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().