diff --git a/android/jni/com/mapswithme/platform/HttpThread.cpp b/android/jni/com/mapswithme/platform/HttpThread.cpp index 2aa63b5d0c..f392276111 100644 --- a/android/jni/com/mapswithme/platform/HttpThread.cpp +++ b/android/jni/com/mapswithme/platform/HttpThread.cpp @@ -24,20 +24,27 @@ public: jclass klass = env->FindClass("com/mapswithme/maps/downloader/DownloadChunkTask"); ASSERT ( klass, () ); - jmethodID methodId = env->GetMethodID(klass, "", "(JLjava/lang/String;JJJLjava/lang/String;Ljava/lang/String;)V"); + jmethodID methodId = env->GetMethodID(klass, "", "(JLjava/lang/String;JJJ[BLjava/lang/String;)V"); ASSERT ( methodId, () ); // User id is always the same, so do not waste time on every chunk call static string uniqueUserId = GetPlatform().UniqueClientId(); + jbyteArray postBody = 0; + size_t const postBodySize = pb.size(); + if (postBodySize) + { + postBody = env->NewByteArray(postBodySize); + env->SetByteArrayRegion(postBody, 0, postBodySize, reinterpret_cast(pb.c_str())); + } m_self = env->NewGlobalRef(env->NewObject(klass, methodId, reinterpret_cast(&cb), env->NewStringUTF(url.c_str()), - (jlong)beg, - (jlong)end, - (jlong)expectedFileSize, - env->NewStringUTF(pb.c_str()), + static_cast(beg), + static_cast(end), + static_cast(expectedFileSize), + postBody, env->NewStringUTF(uniqueUserId.c_str()))); ASSERT ( m_self, () ); diff --git a/android/src/com/mapswithme/maps/downloader/DownloadChunkTask.java b/android/src/com/mapswithme/maps/downloader/DownloadChunkTask.java index 0eb523025a..e2ea53c62e 100644 --- a/android/src/com/mapswithme/maps/downloader/DownloadChunkTask.java +++ b/android/src/com/mapswithme/maps/downloader/DownloadChunkTask.java @@ -25,7 +25,7 @@ class DownloadChunkTask extends AsyncTask private long m_beg; private long m_end; private long m_expectedFileSize; - private String m_postBody; + private byte[] m_postBody; private String m_userAgent; private final int NOT_SET = -1; @@ -44,7 +44,7 @@ class DownloadChunkTask extends AsyncTask native void onFinish(long httpCallbackID, long httpCode, long beg, long end); public DownloadChunkTask(long httpCallbackID, String url, long beg, long end, - long expectedFileSize, String postBody, String userAgent) + long expectedFileSize, byte[] postBody, String userAgent) { m_httpCallbackID = httpCallbackID; m_url = url; @@ -153,15 +153,15 @@ class DownloadChunkTask extends AsyncTask urlConnection.setRequestProperty("Range", String.format("bytes=%d-", m_beg)); } - if (m_postBody.length() > 0) + if (m_postBody != null) { urlConnection.setDoOutput(true); - byte[] utf8 = m_postBody.getBytes("UTF-8"); - urlConnection.setFixedLengthStreamingMode(utf8.length); + urlConnection.setFixedLengthStreamingMode(m_postBody.length); final DataOutputStream os = new DataOutputStream(urlConnection.getOutputStream()); - os.write(utf8); + os.write(m_postBody); os.flush(); + m_postBody = null; Utils.closeStream(os); }