2

首先,我使用以下脚本在我的 Mac 上编译了 libcurl。

ARCH=$1
API_VER="21"

if [ $ARCH == "x86" ]; then
    HOST="i686"
    DEST_DIR="x86"
elif [ $ARCH == "x86_64" ]; then
    HOST="x86_64"
    DEST_DIR="x86_64"
elif [ $ARCH == "arm" ]; then
    HOST="arm"
    DEST_DIR="armeabi-v7a"
elif [ $ARCH == "arm64" ]; then
    HOST="aarch64"
    DEST_DIR="arm64-v8a"
fi

if [ $HOST == "arm" ]; then
    CLANG="armv7a-linux-androideabi$API_VER-clang"
    HOST="$HOST-linux-androideabi"
else
    CLANG="$HOST-linux-android$API_VER-clang"
    HOST="$HOST-linux-android"
fi

NDK_VER="20"
NDK_HOME="/Users/visor24-mac/Android-NDK/android-ndk-r$NDK_VER"
SYSROOT="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
INCPATH="/Users/visor24-mac/Project/External/prebuilt/include/android/${DEST_DIR}/openssl"
LIBPATH="/Users/visor24-mac/Project/External/prebuilt/lib/android/${DEST_DIR}"
PREFIX="/Users/visor24-mac/Project/External/curl/build/android/$ARCH"

export PATH="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin":"$PATH"
export CC="$CLANG"
export CPPFLAGS="-I${INCPATH}"
export CFLAGS="--sysroot ${SYSROOT} -O3"
export LDFLAGS="-L${LIBPATH} --sysroot ${SYSROOT}"

./configure --disable-shared --enable-static --host=$HOST --prefix=$PREFIX
make -j 4 && make install || exit 2

然后是下载网址的代码。

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
    l_info << written;
    if ( size * nmemb != written )
        l_error;

    g_written += written;

    return written;
}

static void DownloadURL( const std::string& url, const std::string& fileName )
{
    CURL* curlHandle = nullptr;
    FILE* file = nullptr;

    curl_global_init(CURL_GLOBAL_ALL);
    curlHandle = curl_easy_init();
    auto rc = curl_easy_setopt( curlHandle, CURLOPT_URL, url.c_str() );
    rc = curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 0L );
    rc = curl_easy_setopt( curlHandle, CURLOPT_NOPROGRESS, 1L );
    rc = curl_easy_setopt( curlHandle, CURLOPT_SSL_VERIFYHOST, 0L );
    rc = curl_easy_setopt( curlHandle, CURLOPT_SSL_VERIFYPEER, 0L );
    rc = curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, write_data );

    file = fopen( fileName.c_str(), "wb" );
    if ( file )
    {
        //curl_easy_setopt( curlHandle, CURLOPT_WRITEDATA, stdout );
        curl_easy_setopt( curlHandle, CURLOPT_WRITEDATA, file );
        rc = curl_easy_perform(curlHandle);
        if ( rc != CURLE_OK )
        {
            l_error << curl_easy_strerror( rc );
        }
        else
        {
            l_info << "CURL DOWNLOAD SUCCESS!!!!";
        }

        fclose( file );
    }

    curl_easy_cleanup( curlHandle );
    curl_global_cleanup();
}

和 python 简单的服务器。

python3 -m http.server

除一种情况外,一切正常。libcurl 在中间跳过一个字节几次,导致原始文件的几个字节短文件,并出现以下错误。

传输了部分文件

这只发生在 Windows 上运行的模拟器中,并且仅在从我的 python 简单服务器下载时发生。

真正的手机设备工作正常。Mac 上的模拟器运行良好。当我下载一些随机的网络内容时,即使是 Win 上的模拟器也能正常工作。

我可以继续在我的 Mac 上工作,它解决了这个问题,但这有点烦人,因为 Windows PC 是我的主要开发机器。我很好奇是什么原因造成的。正如我所说,libcurl 是在 Mac 上为所有 ABI 编译的,然后我将它们与我在 Win PC 上的 Android Studio 中的应用程序链接起来。因此,即使 libcurl 和我的应用程序的 ABI 相同,交叉编译主机操作系统也不是。这会导致问题吗?有任何想法吗?

4

0 回答 0