From 7a4f741f561c554e283aa76f717a96e3724798e4 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 29 Jun 2017 16:53:47 +0900 Subject: fix: android/multinetwork.h can't be imported when using libandroid_net libandroid_net is a subset of libandroid exposing the multinetwork functionality. Contrary to libandroid which is not available to vendors, libandroid_net is available to vendors as ll-ndk. However, the header path for the two libraries are different. for libandroid: include for libandroid_net: include This is because multinetwork.h is located in /include directory. Since many vendors are using , we need to have a subdirectory 'android'. Bug: 63120916 Test: build Change-Id: I1cbc6e1641edda2013c80f9b16b825f0854776c1 --- native/android/include/android/multinetwork.h | 1 + native/android/include/multinetwork.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 120000 native/android/include/android/multinetwork.h delete mode 120000 native/android/include/multinetwork.h (limited to 'native/android') diff --git a/native/android/include/android/multinetwork.h b/native/android/include/android/multinetwork.h new file mode 120000 index 000000000000..0feab3aa27cd --- /dev/null +++ b/native/android/include/android/multinetwork.h @@ -0,0 +1 @@ +../../../../../native/include/android/multinetwork.h \ No newline at end of file diff --git a/native/android/include/multinetwork.h b/native/android/include/multinetwork.h deleted file mode 120000 index f9d051aa9f24..000000000000 --- a/native/android/include/multinetwork.h +++ /dev/null @@ -1 +0,0 @@ -../../../../native/include/android/multinetwork.h \ No newline at end of file -- cgit v1.2.3-59-g8ed1b From e4f60cce8552a565efacf4907242574b9e00492d Mon Sep 17 00:00:00 2001 From: John Reck Date: Mon, 7 Aug 2017 11:17:06 -0700 Subject: SharedMemory API changes Hides getFd & getFileDescriptor due to lifecycle concenrs. Adds ASharedMemory_dupFromJava to allow sharing a shared memory region between Java & Native as safe as possible. Mis-use results in an FD leak instead of double-close. Bug: 64394076 Test: SharedMemory CTS tests Change-Id: I01a5eb978fc4e99559a79baac75754c32f13bdc4 --- api/current.txt | 3 --- api/system-current.txt | 3 --- api/test-current.txt | 3 --- core/java/android/os/MemoryFile.java | 2 ++ core/java/android/os/SharedMemory.java | 7 +++++- native/android/libandroid.map.txt | 1 + native/android/sharedmem.cpp | 43 ++++++++++++++++++++++++++++++++++ 7 files changed, 52 insertions(+), 10 deletions(-) (limited to 'native/android') diff --git a/api/current.txt b/api/current.txt index 8d2e9c8b9a54..c5fe76b30eac 100644 --- a/api/current.txt +++ b/api/current.txt @@ -31066,7 +31066,6 @@ package android.os { ctor public MemoryFile(java.lang.String, int) throws java.io.IOException; method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException; method public void close(); - method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException; method public java.io.InputStream getInputStream(); method public java.io.OutputStream getOutputStream(); method public deprecated boolean isPurgingAllowed(); @@ -31498,8 +31497,6 @@ package android.os { method public void close(); method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException; method public int describeContents(); - method public int getFd(); - method public java.io.FileDescriptor getFileDescriptor(); method public int getSize(); method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException; method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException; diff --git a/api/system-current.txt b/api/system-current.txt index e2754fdd9cd5..60e4960d2b65 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -33911,7 +33911,6 @@ package android.os { ctor public MemoryFile(java.lang.String, int) throws java.io.IOException; method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException; method public void close(); - method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException; method public java.io.InputStream getInputStream(); method public java.io.OutputStream getOutputStream(); method public deprecated boolean isPurgingAllowed(); @@ -34372,8 +34371,6 @@ package android.os { method public void close(); method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException; method public int describeContents(); - method public int getFd(); - method public java.io.FileDescriptor getFileDescriptor(); method public int getSize(); method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException; method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException; diff --git a/api/test-current.txt b/api/test-current.txt index fcb404edff99..70addad3c38d 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -31223,7 +31223,6 @@ package android.os { ctor public MemoryFile(java.lang.String, int) throws java.io.IOException; method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException; method public void close(); - method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException; method public java.io.InputStream getInputStream(); method public java.io.OutputStream getOutputStream(); method public deprecated boolean isPurgingAllowed(); @@ -31656,8 +31655,6 @@ package android.os { method public void close(); method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException; method public int describeContents(); - method public int getFd(); - method public java.io.FileDescriptor getFileDescriptor(); method public int getSize(); method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException; method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException; diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java index 9294c449e4d6..ff3258f806c9 100644 --- a/core/java/android/os/MemoryFile.java +++ b/core/java/android/os/MemoryFile.java @@ -219,6 +219,8 @@ public class MemoryFile { * The returned file descriptor is not duplicated. * * @throws IOException If the memory file has been closed. + * + * @hide */ public FileDescriptor getFileDescriptor() throws IOException { return mSharedMemory.getFileDescriptor(); diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index 459aeb087c2f..e6c7a1716941 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -60,7 +60,8 @@ public final class SharedMemory implements Parcelable, Closeable { } mMemoryRegistration = new MemoryRegistration(mSize); - mCleaner = Cleaner.create(this, new Closer(mFileDescriptor, mMemoryRegistration)); + mCleaner = Cleaner.create(mFileDescriptor, + new Closer(mFileDescriptor, mMemoryRegistration)); } /** @@ -138,6 +139,8 @@ public final class SharedMemory implements Parcelable, Closeable { * This FileDescriptor is interoperable with the ASharedMemory NDK APIs. * * @return Returns the FileDescriptor associated with this object. + * + * @hide Exists only for MemoryFile interop */ public @NonNull FileDescriptor getFileDescriptor() { return mFileDescriptor; @@ -150,6 +153,8 @@ public final class SharedMemory implements Parcelable, Closeable { * This fd is interoperable with the ASharedMemory NDK APIs. * * @return Returns the native fd associated with this object, or -1 if it is already closed. + * + * @hide Exposed for native ASharedMemory_dupFromJava() */ public int getFd() { return mFileDescriptor.getInt$(); diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index c82a1f6a646a..bbd27839d551 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -198,6 +198,7 @@ LIBANDROID { ASharedMemory_create; # introduced=26 ASharedMemory_getSize; # introduced=26 ASharedMemory_setProt; # introduced=26 + ASharedMemory_dupFromJava; # introduced=27 AStorageManager_delete; AStorageManager_getMountedObbPath; AStorageManager_isObbMounted; diff --git a/native/android/sharedmem.cpp b/native/android/sharedmem.cpp index 9d029dfad41a..757aaecab40d 100644 --- a/native/android/sharedmem.cpp +++ b/native/android/sharedmem.cpp @@ -14,10 +14,36 @@ * limitations under the License. */ +#include + #include +#include #include +#include #include +#include +#include + +static struct { + jclass clazz; + jmethodID getFd; +} sSharedMemory; + +static void jniInit(JNIEnv* env) { + static std::once_flag sJniInitialized; + std::call_once(sJniInitialized, [](JNIEnv* env) { + jclass clazz = env->FindClass("android/os/SharedMemory"); + LOG_ALWAYS_FATAL_IF(clazz == nullptr, "Failed to find android.os.SharedMemory"); + sSharedMemory.clazz = (jclass) env->NewGlobalRef(clazz); + LOG_ALWAYS_FATAL_IF(sSharedMemory.clazz == nullptr, + "Failed to create global ref of android.os.SharedMemory"); + sSharedMemory.getFd = env->GetMethodID(sSharedMemory.clazz, "getFd", "()I"); + LOG_ALWAYS_FATAL_IF(sSharedMemory.getFd == nullptr, + "Failed to find method SharedMemory#getFd()"); + }, env); +} + int ASharedMemory_create(const char *name, size_t size) { if (size == 0) { return android::BAD_VALUE; @@ -32,3 +58,20 @@ size_t ASharedMemory_getSize(int fd) { int ASharedMemory_setProt(int fd, int prot) { return ashmem_set_prot_region(fd, prot); } + +int ASharedMemory_dupFromJava(JNIEnv* env, jobject javaSharedMemory) { + if (env == nullptr || javaSharedMemory == nullptr) { + return -1; + } + jniInit(env); + if (!env->IsInstanceOf(javaSharedMemory, sSharedMemory.clazz)) { + ALOGW("ASharedMemory_dupFromJava called with object " + "that's not an instanceof android.os.SharedMemory"); + return -1; + } + int fd = env->CallIntMethod(javaSharedMemory, sSharedMemory.getFd); + if (fd != -1) { + fd = dup(fd); + } + return fd; +} -- cgit v1.2.3-59-g8ed1b