diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index ac456b85d..e110d530a 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -63,5 +63,5 @@ FetchContent_MakeAvailable(libarchive) include_directories(${libarchive_SOURCE_DIR}/libarchive) # Build and link our app's native lib -add_library(${PROJECT_NAME} SHARED archive.c fdutils.c gifutils.c natsort/strnatcmp.c) +add_library(${PROJECT_NAME} SHARED archive.c gifutils.c natsort/strnatcmp.c) target_link_libraries(${PROJECT_NAME} archive_static log) diff --git a/app/src/main/cpp/archive.c b/app/src/main/cpp/archive.c index a5500eaf2..0595236b6 100644 --- a/app/src/main/cpp/archive.c +++ b/app/src/main/cpp/archive.c @@ -459,7 +459,7 @@ Java_com_hippo_UriArchiveAccessor_getFilename(JNIEnv *env, jobject thiz, jint in } JNIEXPORT void JNICALL -Java_com_hippo_UriArchiveAccessor_extractToFd(JNIEnv *env, jobject thiz, jint index, jint fd) { +Java_com_hippo_UriArchiveAccessor_extractToFd(JNIEnv *env, jobject thiz, jint index, jobject fd) { EH_UNUSED(env); EH_UNUSED(thiz); index = entries[index].index; @@ -467,7 +467,10 @@ Java_com_hippo_UriArchiveAccessor_extractToFd(JNIEnv *env, jobject thiz, jint in int ret; ret = archive_get_ctx(&ctx, index); if (!ret) { - archive_read_data_into_fd(ctx->arc, fd); + jclass fdClass = (*env)->FindClass(env, "java/io/FileDescriptor"); + jfieldID fdClassDescriptorFieldID = (*env)->GetFieldID(env, fdClass, "descriptor", "I"); + int realfd = (*env)->GetIntField(env, fd, fdClassDescriptorFieldID); + archive_read_data_into_fd(ctx->arc, realfd); ctx->using = 0; } } diff --git a/app/src/main/cpp/fdutils.c b/app/src/main/cpp/fdutils.c deleted file mode 100644 index 79db79a58..000000000 --- a/app/src/main/cpp/fdutils.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include - -#define LOG_TAG "mmap_utils" - -#include "ehviewer.h" - -// TODO: Replace it with AFileDescriptor_getFd when minsdk 31 -// https://developer.android.com/ndk/reference/group/file-descriptor -JNIEXPORT jint JNICALL -Java_com_hippo_Native_getFd(JNIEnv *env, jclass clazz, jobject fileDescriptor) { - jint fd = -1; - jclass fdClass = (*env)->FindClass(env, "java/io/FileDescriptor"); - - if (fdClass != NULL) { - jfieldID fdClassDescriptorFieldID = (*env)->GetFieldID(env, fdClass, "descriptor", "I"); - if (fdClassDescriptorFieldID != NULL && fileDescriptor != NULL) { - fd = (*env)->GetIntField(env, fileDescriptor, fdClassDescriptorFieldID); - } - } - - return fd; -} - -JNIEXPORT void JNICALL -Java_com_hippo_Native_sendfile(JNIEnv *env, jclass clazz, jint from, jint to) { - struct stat st; - fstat(from, &st); - sendfile(to, from, 0, st.st_size); -} diff --git a/app/src/main/java/com/hippo/Native.kt b/app/src/main/java/com/hippo/Native.kt index c4120f863..3385a3679 100644 --- a/app/src/main/java/com/hippo/Native.kt +++ b/app/src/main/java/com/hippo/Native.kt @@ -22,22 +22,10 @@ import android.system.Int64Ref import android.system.Os import java.io.FileDescriptor -object Native { - fun initialize() { - System.loadLibrary("ehviewer") - } - - @JvmStatic - external fun getFd(fd: FileDescriptor?): Int -} - private fun sendFileTotally(from: FileDescriptor, to: FileDescriptor) { Os.sendfile(to, from, Int64Ref(0), Long.MAX_VALUE) } -val FileDescriptor.fd - get() = Native.getFd(this) - infix fun ParcelFileDescriptor.sendTo(fd: FileDescriptor) { sendFileTotally(fileDescriptor, fd) } diff --git a/app/src/main/java/com/hippo/UriArchiveAccessor.kt b/app/src/main/java/com/hippo/UriArchiveAccessor.kt index 9ff3f0686..9f844f8d9 100644 --- a/app/src/main/java/com/hippo/UriArchiveAccessor.kt +++ b/app/src/main/java/com/hippo/UriArchiveAccessor.kt @@ -22,6 +22,7 @@ import android.graphics.ImageDecoder import android.net.Uri import android.util.Log import com.hippo.image.Image +import java.io.FileDescriptor import java.nio.ByteBuffer class UriArchiveAccessor(ctx: Context, private val uri: Uri) { @@ -33,7 +34,7 @@ class UriArchiveAccessor(ctx: Context, private val uri: Uri) { private external fun openArchive(fd: Int, size: Long): Int private external fun extractToByteBuffer(index: Int): ByteBuffer? - external fun extractToFd(index: Int, fd: Int) + external fun extractToFd(index: Int, fd: FileDescriptor) external fun getFilename(index: Int): String external fun needPassword(): Boolean external fun providePassword(str: String): Boolean diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt index 2d4ae32f0..b4342065a 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt @@ -28,7 +28,6 @@ import androidx.lifecycle.ProcessLifecycleOwner import coil.ImageLoader import coil.ImageLoaderFactory import coil.util.DebugLogger -import com.hippo.Native import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhDns import com.hippo.ehviewer.client.EhSSLSocketFactory @@ -84,7 +83,7 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor handler?.uncaughtException(t, e) } super.onCreate() - Native.initialize() + System.loadLibrary("ehviewer") GetText.initialize(this) Settings.initialize() ReadableTime.initialize(this) diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 0a1ead20d..290e2a8b3 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -17,7 +17,6 @@ package com.hippo.ehviewer.gallery import android.content.Context import android.net.Uri -import com.hippo.Native.getFd import com.hippo.UriArchiveAccessor import com.hippo.ehviewer.Settings import com.hippo.image.Image @@ -138,16 +137,14 @@ class ArchivePageLoader(context: Context, uri: Uri, passwdFlow: Flow) : } override fun save(index: Int, file: UniFile): Boolean { - val fd: Int val stream: FileOutputStream try { stream = file.openOutputStream() as FileOutputStream - fd = getFd(stream.fd) } catch (e: IOException) { e.printStackTrace() return false } - archiveAccessor.extractToFd(index, fd) + archiveAccessor.extractToFd(index, stream.fd) try { stream.close() } catch (e: IOException) {