[android] Refactored old local-ref definitions.

This commit is contained in:
Dmitry Yunitsky 2016-04-12 19:58:48 +03:00
parent a2630cde5c
commit bd02659bc6
5 changed files with 62 additions and 90 deletions

View file

@ -15,22 +15,18 @@ extern "C"
if (items.empty())
return;
static jclass const pairClass = static_cast<jclass>(env->NewGlobalRef(env->FindClass("android/util/Pair")));
static jmethodID const pairCtor = env->GetMethodID(pairClass, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
static jmethodID const listAddMethod = env->GetMethodID(env->GetObjectClass(result), "add", "(Ljava/lang/Object;)Z");
static jclass const pairClass = jni::GetGlobalClassRef(env, "android/util/Pair");
static jmethodID const pairCtor = jni::GetConstructorID(env, pairClass, "(Ljava/lang/Object;Ljava/lang/Object;)V");
static jmethodID const listAddMethod = jni::GetMethodID(env, result, "add", "(Ljava/lang/Object;)Z");
for (TSearchRequest const & item : items)
{
jstring locale = jni::ToJavaString(env, item.first.c_str());
jstring query = jni::ToJavaString(env, item.second.c_str());
jobject pair = env->NewObject(pairClass, pairCtor, locale, query);
ASSERT(pair, (jni::DescribeException()));
jni::TScopedLocalRef locale(env, jni::ToJavaString(env, item.first.c_str()));
jni::TScopedLocalRef query(env, jni::ToJavaString(env, item.second.c_str()));
jni::TScopedLocalRef pair(env, env->NewObject(pairClass, pairCtor, locale.get(), query.get()));
ASSERT(pair.get(), (jni::DescribeException()));
env->CallBooleanMethod(result, listAddMethod, pair);
env->DeleteLocalRef(locale);
env->DeleteLocalRef(query);
env->DeleteLocalRef(pair);
env->CallBooleanMethod(result, listAddMethod, pair.get());
}
}

View file

@ -105,8 +105,8 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkCategory_nativeGetTrack(
ASSERT(nTrack, ("Track must not be null with index:)", bmkId));
string formattedLenght;
MeasurementUtils::FormatDistance(nTrack->GetLengthMeters(), formattedLenght);
string formattedLength;
MeasurementUtils::FormatDistance(nTrack->GetLengthMeters(), formattedLength);
dp::Color nColor = nTrack->GetColor(0);
@ -117,6 +117,6 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkCategory_nativeGetTrack(
return env->NewObject(trackClazz, cId,
bmkId, id, jni::ToJavaString(env, nTrack->GetName()),
jni::ToJavaString(env, formattedLenght), androidColor);
jni::ToJavaString(env, formattedLength), androidColor);
}
} // extern "C"

View file

@ -227,7 +227,6 @@ Java_com_mapswithme_maps_editor_Editor_nativeHasWifi(JNIEnv *, jclass)
return g_editableMapObject.GetMetadata().Get(feature::Metadata::FMD_INTERNET) == "wlan";
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_editor_Editor_nativeHasSomethingToUpload(JNIEnv * env, jclass clazz)
{

View file

@ -68,9 +68,8 @@ jobjectArray JavaTimespans(JNIEnv * env, vector<Timespan> const & spans)
jobjectArray const result = env->NewObjectArray(size, g_clazzTimespan, 0);
for (int i = 0; i < size; i++)
{
jobject const jSpan = JavaTimespan(env, spans[i]);
env->SetObjectArrayElement(result, i, jSpan);
env->DeleteLocalRef(jSpan);
jni::TScopedLocalRef jSpan(env, JavaTimespan(env, spans[i]));
env->SetObjectArrayElement(result, i, jSpan.get());
}
return result;
@ -109,9 +108,8 @@ jobjectArray JavaTimetables(JNIEnv * env, TimeTableSet & tts)
jobjectArray const result = env->NewObjectArray(size, g_clazzTimetable, 0);
for (int i = 0; i < size; i++)
{
jobject const jTable = JavaTimetable(env, tts.Get(i));
env->SetObjectArrayElement(result, i, jTable);
env->DeleteLocalRef(jTable);
jni::TScopedLocalRef jTable(env, JavaTimetable(env, tts.Get(i)));
env->SetObjectArrayElement(result, i, jTable.get());
}
return result;
@ -149,12 +147,9 @@ TimeTable NativeTimetable(JNIEnv * env, jobject jTimetable)
size = env->GetArrayLength(jClosedSpans);
for (int i = 0; i < size; i++)
{
jobject const jSpan = env->GetObjectArrayElement(jClosedSpans, i);
if (jSpan)
{
tt.AddExcludeTime(NativeTimespan(env, jSpan));
env->DeleteLocalRef(jSpan);
}
jni::TScopedLocalRef jSpan(env, env->GetObjectArrayElement(jClosedSpans, i));
if (jSpan.get())
tt.AddExcludeTime(NativeTimespan(env, jSpan.get()));
}
return tt;
}
@ -168,9 +163,8 @@ TimeTableSet NativeTimetableSet(JNIEnv * env, jobjectArray jTimetables)
for (int i = 1; i < size; i++)
{
jobject const timetable = env->GetObjectArrayElement(jTimetables, i);
tts.Append(NativeTimetable(env, timetable));
env->DeleteLocalRef(timetable);
jni::TScopedLocalRef timetable(env, env->GetObjectArrayElement(jTimetables, i));
tts.Append(NativeTimetable(env, timetable.get()));
}
return tts;

View file

@ -1,8 +1,7 @@
#include "platform/http_thread_callback.hpp"
#include "Platform.hpp"
#include "../core/jni_helper.hpp"
#include "Platform.hpp"
#include "platform/http_thread_callback.hpp"
class HttpThread
{
@ -17,64 +16,48 @@ public:
int64_t expectedFileSize,
string const & pb)
{
/// should create java object here.
JNIEnv * env = jni::GetEnv();
ASSERT ( env, () );
jclass klass = env->FindClass("com/mapswithme/maps/downloader/ChunkTask");
ASSERT ( klass, () );
static jmethodID initMethodId = env->GetMethodID(klass, "<init>", "(JLjava/lang/String;JJJ[BLjava/lang/String;)V");
ASSERT ( initMethodId, () );
static jclass const klass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/downloader/ChunkTask");
// public ChunkTask(long httpCallbackID, String url, long beg, long end,
// long expectedFileSize, byte[] postBody, String userAgent)
static jmethodID const initMethodId = jni::GetConstructorID(env, klass, "(JLjava/lang/String;JJJ[BLjava/lang/String;)V");
static jmethodID const startMethodId = env->GetMethodID(klass, "start", "()V");
// User id is always the same, so do not waste time on every chunk call
static string uniqueUserId = GetPlatform().UniqueClientId();
static string const uniqueUserId = GetPlatform().UniqueClientId();
jbyteArray postBody = 0;
jni::TScopedLocalByteArrayRef postBody(env, nullptr);
size_t const postBodySize = pb.size();
if (postBodySize)
{
postBody = env->NewByteArray(postBodySize);
env->SetByteArrayRegion(postBody, 0, postBodySize, reinterpret_cast<jbyte const *>(pb.c_str()));
postBody.reset(env->NewByteArray(postBodySize));
env->SetByteArrayRegion(postBody.get(), 0, postBodySize, reinterpret_cast<jbyte const *>(pb.c_str()));
}
jstring jUrl = env->NewStringUTF(url.c_str());
jstring jUserId = env->NewStringUTF(uniqueUserId.c_str());
jobject const localSelf = env->NewObject(klass,
initMethodId,
reinterpret_cast<jlong>(&cb),
jUrl,
static_cast<jlong>(beg),
static_cast<jlong>(end),
static_cast<jlong>(expectedFileSize),
postBody,
jUserId);
m_self = env->NewGlobalRef(localSelf);
ASSERT ( m_self, () );
env->DeleteLocalRef(localSelf);
env->DeleteLocalRef(postBody);
env->DeleteLocalRef(jUrl);
env->DeleteLocalRef(jUserId);
static jmethodID startMethodId = env->GetMethodID(klass, "start", "()V");
ASSERT ( startMethodId, () );
env->DeleteLocalRef(klass);
jni::TScopedLocalRef jUrl(env, jni::ToJavaString(env, url.c_str()));
jni::TScopedLocalRef jUserId(env, jni::ToJavaString(env, uniqueUserId.c_str()));
jni::TScopedLocalRef localSelf(env, env->NewObject(klass,
initMethodId,
reinterpret_cast<jlong>(&cb),
jUrl.get(),
static_cast<jlong>(beg),
static_cast<jlong>(end),
static_cast<jlong>(expectedFileSize),
postBody.get(),
jUserId.get()));
m_self = env->NewGlobalRef(localSelf.get());
ASSERT(m_self, ());
env->CallVoidMethod(m_self, startMethodId);
jni::DumpDalvikReferenceTables();
}
~HttpThread()
{
JNIEnv * env = jni::GetEnv();
ASSERT ( env, () );
jmethodID methodId = jni::GetMethodID(env, m_self, "cancel", "(Z)Z");
ASSERT ( methodId, () );
env->CallBooleanMethod(m_self, methodId, false);
env->DeleteGlobalRef(m_self);
}
};
@ -100,22 +83,22 @@ namespace downloader
extern "C"
{
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong beg, jbyteArray data, jlong size)
{
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID);
jbyte * buf = env->GetByteArrayElements(data, 0);
ASSERT ( buf, () );
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnWrite(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong beg, jbyteArray data, jlong size)
{
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID);
jbyte * buf = env->GetByteArrayElements(data, 0);
ASSERT(buf, ());
bool const ret = cb->OnWrite(beg, buf, size);
env->ReleaseByteArrayElements(data, buf, 0);
return ret;
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong httpCode, jlong beg, jlong end)
{
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID);
cb->OnFinish(httpCode, beg, end);
}
bool const ret = cb->OnWrite(beg, buf, size);
env->ReleaseByteArrayElements(data, buf, 0);
return ret;
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_downloader_ChunkTask_nativeOnFinish(JNIEnv * env, jclass clazz, jlong httpCallbackID, jlong httpCode, jlong beg, jlong end)
{
downloader::IHttpThreadCallback * cb = reinterpret_cast<downloader::IHttpThreadCallback*>(httpCallbackID);
cb->OnFinish(httpCode, beg, end);
}
} // extern "C"