forked from organicmaps/organicmaps
[android] Reformatted a bit.
This commit is contained in:
parent
047052ec86
commit
1bc43d6319
2 changed files with 217 additions and 217 deletions
|
@ -19,188 +19,188 @@ jclass g_bookmarkClazz;
|
|||
|
||||
extern "C"
|
||||
{
|
||||
JNIEXPORT jint JNICALL
|
||||
JNI_OnLoad(JavaVM * jvm, void *)
|
||||
{
|
||||
g_jvm = jvm;
|
||||
jni::InitSystemLog();
|
||||
jni::InitAssertLog();
|
||||
JNIEXPORT jint JNICALL
|
||||
JNI_OnLoad(JavaVM * jvm, void *)
|
||||
{
|
||||
g_jvm = jvm;
|
||||
jni::InitSystemLog();
|
||||
jni::InitAssertLog();
|
||||
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
g_mapObjectClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/MapObject");
|
||||
g_bookmarkClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/Bookmark");
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
g_mapObjectClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/MapObject");
|
||||
g_bookmarkClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/Bookmark");
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
JNI_OnUnload(JavaVM *, void *)
|
||||
{
|
||||
g_jvm = 0;
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
env->DeleteGlobalRef(g_mapObjectClazz);
|
||||
env->DeleteGlobalRef(g_bookmarkClazz);
|
||||
}
|
||||
JNIEXPORT void JNICALL
|
||||
JNI_OnUnload(JavaVM *, void *)
|
||||
{
|
||||
g_jvm = 0;
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
env->DeleteGlobalRef(g_mapObjectClazz);
|
||||
env->DeleteGlobalRef(g_bookmarkClazz);
|
||||
}
|
||||
} // extern "C"
|
||||
|
||||
namespace jni
|
||||
{
|
||||
JNIEnv * GetEnv()
|
||||
{
|
||||
JNIEnv * env;
|
||||
if (JNI_OK != g_jvm->GetEnv((void **)&env, JNI_VERSION_1_6))
|
||||
MYTHROW(RootException, ("Can't get JNIEnv. Was thread attached to JVM?"));
|
||||
JNIEnv * GetEnv()
|
||||
{
|
||||
JNIEnv * env;
|
||||
if (JNI_OK != g_jvm->GetEnv((void **)&env, JNI_VERSION_1_6))
|
||||
MYTHROW(RootException, ("Can't get JNIEnv. Was thread attached to JVM?"));
|
||||
|
||||
return env;
|
||||
return env;
|
||||
}
|
||||
|
||||
JavaVM * GetJVM()
|
||||
{
|
||||
ASSERT(g_jvm, ("JVM is not initialized"));
|
||||
return g_jvm;
|
||||
}
|
||||
|
||||
jmethodID GetMethodID(JNIEnv * env, jobject obj, char const * fn, char const * sig)
|
||||
{
|
||||
TScopedLocalClassRef clazz(env, env->GetObjectClass(obj));
|
||||
ASSERT(clazz.get(), ("Can't get class: ", DescribeException()));
|
||||
|
||||
jmethodID mid = env->GetMethodID(clazz.get(), fn, sig);
|
||||
ASSERT(mid, ("Can't get methodID", fn, sig, DescribeException()));
|
||||
return mid;
|
||||
}
|
||||
|
||||
jmethodID GetConstructorID(JNIEnv * env, jclass clazz, char const * sig)
|
||||
{
|
||||
jmethodID const ctorID = env->GetMethodID(clazz, "<init>", sig);
|
||||
ASSERT(ctorID, (DescribeException()));
|
||||
return ctorID;
|
||||
}
|
||||
|
||||
jclass GetGlobalClassRef(JNIEnv * env, char const * sig)
|
||||
{
|
||||
jclass klass = env->FindClass(sig);
|
||||
ASSERT(klass, ("Can't get class : ", DescribeException()));
|
||||
return static_cast<jclass>(env->NewGlobalRef(klass));
|
||||
}
|
||||
|
||||
string ToNativeString(JNIEnv * env, jstring str)
|
||||
{
|
||||
string result;
|
||||
char const * utfBuffer = env->GetStringUTFChars(str, 0);
|
||||
if (utfBuffer)
|
||||
{
|
||||
result = utfBuffer;
|
||||
env->ReleaseStringUTFChars(str, utfBuffer);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
string ToNativeString(JNIEnv * env, jbyteArray const & bytes)
|
||||
{
|
||||
int const len = env->GetArrayLength(bytes);
|
||||
vector<char> buffer(len);
|
||||
env->GetByteArrayRegion(bytes, 0, len, reinterpret_cast<jbyte *>(buffer.data()));
|
||||
return string(buffer.data(), len);
|
||||
}
|
||||
|
||||
jstring ToJavaString(JNIEnv * env, char const * s)
|
||||
{
|
||||
return env->NewStringUTF(s);
|
||||
}
|
||||
|
||||
jobjectArray ToJavaStringArray(JNIEnv * env, vector<string> const & src)
|
||||
{
|
||||
return ToJavaArray(env, GetStringClass(env), src,
|
||||
[](JNIEnv * env, string const & item)
|
||||
{
|
||||
return ToJavaString(env, item.c_str());
|
||||
});
|
||||
}
|
||||
|
||||
jclass GetStringClass(JNIEnv * env)
|
||||
{
|
||||
return env->FindClass(GetStringClassName());
|
||||
}
|
||||
|
||||
char const * GetStringClassName()
|
||||
{
|
||||
return "java/lang/String";
|
||||
}
|
||||
|
||||
struct global_ref_deleter
|
||||
{
|
||||
void operator()(jobject * ref)
|
||||
{
|
||||
GetEnv()->DeleteGlobalRef(*ref);
|
||||
delete ref;
|
||||
}
|
||||
};
|
||||
|
||||
shared_ptr<jobject> make_global_ref(jobject obj)
|
||||
{
|
||||
jobject * ref = new jobject;
|
||||
*ref = GetEnv()->NewGlobalRef(obj);
|
||||
return shared_ptr<jobject>(ref, global_ref_deleter());
|
||||
}
|
||||
|
||||
string DescribeException()
|
||||
{
|
||||
JNIEnv * env = GetEnv();
|
||||
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
jthrowable e = env->ExceptionOccurred();
|
||||
|
||||
// have to clear the exception before JNI will work again.
|
||||
env->ExceptionClear();
|
||||
|
||||
jclass eclass = env->GetObjectClass(e);
|
||||
|
||||
jmethodID mid = env->GetMethodID(eclass, "toString", "()Ljava/lang/String;");
|
||||
|
||||
jstring jErrorMsg = (jstring) env->CallObjectMethod(e, mid);
|
||||
|
||||
return ToNativeString(env, jErrorMsg);
|
||||
}
|
||||
|
||||
JavaVM * GetJVM()
|
||||
{
|
||||
ASSERT(g_jvm, ("JVM is not initialized"));
|
||||
return g_jvm;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
jmethodID GetMethodID(JNIEnv * env, jobject obj, char const * fn, char const * sig)
|
||||
{
|
||||
TScopedLocalClassRef clazz(env, env->GetObjectClass(obj));
|
||||
ASSERT(clazz.get(), ("Can't get class: ", DescribeException()));
|
||||
jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
jclass klass = env->FindClass("com/mapswithme/maps/bookmarks/data/ParcelablePointD");
|
||||
ASSERT ( klass, () );
|
||||
jmethodID methodID = GetConstructorID(env, klass, "(DD)V");
|
||||
|
||||
jmethodID mid = env->GetMethodID(clazz.get(), fn, sig);
|
||||
ASSERT(mid, ("Can't get methodID", fn, sig, DescribeException()));
|
||||
return mid;
|
||||
}
|
||||
return env->NewObject(klass, methodID,
|
||||
static_cast<jdouble>(point.x),
|
||||
static_cast<jdouble>(point.y));
|
||||
}
|
||||
|
||||
jmethodID GetConstructorID(JNIEnv * env, jclass clazz, char const * sig)
|
||||
{
|
||||
jmethodID const ctorID = env->GetMethodID(clazz, "<init>", sig);
|
||||
ASSERT(ctorID, (DescribeException()));
|
||||
return ctorID;
|
||||
}
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
return GetNewPoint(env, m2::PointI(static_cast<int>(point.x), static_cast<int>(point.y)));
|
||||
}
|
||||
|
||||
jclass GetGlobalClassRef(JNIEnv * env, char const * sig)
|
||||
{
|
||||
jclass klass = env->FindClass(sig);
|
||||
ASSERT(klass, ("Can't get class : ", DescribeException()));
|
||||
return static_cast<jclass>(env->NewGlobalRef(klass));
|
||||
}
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point)
|
||||
{
|
||||
jclass klass = env->FindClass("android/graphics/Point");
|
||||
ASSERT ( klass, () );
|
||||
jmethodID methodID = GetConstructorID(env, klass, "(II)V");
|
||||
|
||||
string ToNativeString(JNIEnv * env, jstring str)
|
||||
{
|
||||
string result;
|
||||
char const * utfBuffer = env->GetStringUTFChars(str, 0);
|
||||
if (utfBuffer)
|
||||
{
|
||||
result = utfBuffer;
|
||||
env->ReleaseStringUTFChars(str, utfBuffer);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return env->NewObject(klass, methodID,
|
||||
static_cast<jint>(point.x),
|
||||
static_cast<jint>(point.y));
|
||||
}
|
||||
|
||||
string ToNativeString(JNIEnv * env, jbyteArray const & bytes)
|
||||
{
|
||||
int const len = env->GetArrayLength(bytes);
|
||||
vector<char> buffer(len);
|
||||
env->GetByteArrayRegion(bytes, 0, len, reinterpret_cast<jbyte *>(buffer.data()));
|
||||
return string(buffer.data(), len);
|
||||
}
|
||||
|
||||
jstring ToJavaString(JNIEnv * env, char const * s)
|
||||
{
|
||||
return env->NewStringUTF(s);
|
||||
}
|
||||
|
||||
jobjectArray ToJavaStringArray(JNIEnv * env, vector<string> const & src)
|
||||
{
|
||||
return ToJavaArray(env, GetStringClass(env), src,
|
||||
[](JNIEnv * env, string const & item)
|
||||
{
|
||||
return ToJavaString(env, item.c_str());
|
||||
});
|
||||
}
|
||||
|
||||
jclass GetStringClass(JNIEnv * env)
|
||||
{
|
||||
return env->FindClass(GetStringClassName());
|
||||
}
|
||||
|
||||
char const * GetStringClassName()
|
||||
{
|
||||
return "java/lang/String";
|
||||
}
|
||||
|
||||
struct global_ref_deleter
|
||||
{
|
||||
void operator()(jobject * ref)
|
||||
{
|
||||
GetEnv()->DeleteGlobalRef(*ref);
|
||||
delete ref;
|
||||
}
|
||||
};
|
||||
|
||||
shared_ptr<jobject> make_global_ref(jobject obj)
|
||||
{
|
||||
jobject * ref = new jobject;
|
||||
*ref = GetEnv()->NewGlobalRef(obj);
|
||||
return shared_ptr<jobject>(ref, global_ref_deleter());
|
||||
}
|
||||
|
||||
string DescribeException()
|
||||
{
|
||||
JNIEnv * env = GetEnv();
|
||||
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
jthrowable e = env->ExceptionOccurred();
|
||||
|
||||
// have to clear the exception before JNI will work again.
|
||||
env->ExceptionClear();
|
||||
|
||||
jclass eclass = env->GetObjectClass(e);
|
||||
|
||||
jmethodID mid = env->GetMethodID(eclass, "toString", "()Ljava/lang/String;");
|
||||
|
||||
jstring jErrorMsg = (jstring) env->CallObjectMethod(e, mid);
|
||||
|
||||
return ToNativeString(env, jErrorMsg);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
jclass klass = env->FindClass("com/mapswithme/maps/bookmarks/data/ParcelablePointD");
|
||||
ASSERT ( klass, () );
|
||||
jmethodID methodID = GetConstructorID(env, klass, "(DD)V");
|
||||
|
||||
return env->NewObject(klass, methodID,
|
||||
static_cast<jdouble>(point.x),
|
||||
static_cast<jdouble>(point.y));
|
||||
}
|
||||
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point)
|
||||
{
|
||||
return GetNewPoint(env, m2::PointI(static_cast<int>(point.x), static_cast<int>(point.y)));
|
||||
}
|
||||
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point)
|
||||
{
|
||||
jclass klass = env->FindClass("android/graphics/Point");
|
||||
ASSERT ( klass, () );
|
||||
jmethodID methodID = GetConstructorID(env, klass, "(II)V");
|
||||
|
||||
return env->NewObject(klass, methodID,
|
||||
static_cast<jint>(point.x),
|
||||
static_cast<jint>(point.y));
|
||||
}
|
||||
|
||||
// This util method dumps content of local and global reference jni tables to logcat for debug and testing purposes
|
||||
void DumpDalvikReferenceTables()
|
||||
{
|
||||
JNIEnv * env = GetEnv();
|
||||
jclass vm_class = env->FindClass("dalvik/system/VMDebug");
|
||||
jmethodID dump_mid = env->GetStaticMethodID(vm_class, "dumpReferenceTables", "()V");
|
||||
env->CallStaticVoidMethod(vm_class, dump_mid);
|
||||
env->DeleteLocalRef(vm_class);
|
||||
}
|
||||
// This util method dumps content of local and global reference jni tables to logcat for debug and testing purposes
|
||||
void DumpDalvikReferenceTables()
|
||||
{
|
||||
JNIEnv * env = GetEnv();
|
||||
jclass vm_class = env->FindClass("dalvik/system/VMDebug");
|
||||
jmethodID dump_mid = env->GetStaticMethodID(vm_class, "dumpReferenceTables", "()V");
|
||||
env->CallStaticVoidMethod(vm_class, dump_mid);
|
||||
env->DeleteLocalRef(vm_class);
|
||||
}
|
||||
} // namespace jni
|
||||
|
|
|
@ -14,56 +14,56 @@ extern jclass g_bookmarkClazz;
|
|||
|
||||
namespace jni
|
||||
{
|
||||
JNIEnv * GetEnv();
|
||||
JavaVM * GetJVM();
|
||||
JNIEnv * GetEnv();
|
||||
JavaVM * GetJVM();
|
||||
|
||||
jmethodID GetMethodID(JNIEnv * env, jobject obj, char const * fn, char const * sig);
|
||||
jmethodID GetConstructorID(JNIEnv * env, jclass clazz, char const * sig);
|
||||
jmethodID GetMethodID(JNIEnv * env, jobject obj, char const * fn, char const * sig);
|
||||
jmethodID GetConstructorID(JNIEnv * env, jclass clazz, char const * sig);
|
||||
|
||||
// Result value should be DeleteGlobalRef`ed by caller
|
||||
jclass GetGlobalClassRef(JNIEnv * env, char const * s);
|
||||
// Result value should be DeleteGlobalRef`ed by caller
|
||||
jclass GetGlobalClassRef(JNIEnv * env, char const * s);
|
||||
|
||||
string ToNativeString(JNIEnv * env, jstring str);
|
||||
// Converts UTF-8 array to native UTF-8 string. Result differs from simple GetStringUTFChars call for characters greater than U+10000,
|
||||
// since jni uses modified UTF (MUTF-8) for strings.
|
||||
string ToNativeString(JNIEnv * env, jbyteArray const & utfBytes);
|
||||
jstring ToJavaString(JNIEnv * env, char const * s);
|
||||
inline jstring ToJavaString(JNIEnv * env, string const & s)
|
||||
{
|
||||
return ToJavaString(env, s.c_str());
|
||||
}
|
||||
|
||||
jclass GetStringClass(JNIEnv * env);
|
||||
char const * GetStringClassName();
|
||||
|
||||
string DescribeException();
|
||||
|
||||
shared_ptr<jobject> make_global_ref(jobject obj);
|
||||
using TScopedLocalRef = ScopedLocalRef<jobject>;
|
||||
using TScopedLocalClassRef = ScopedLocalRef<jclass>;
|
||||
using TScopedLocalObjectArrayRef = ScopedLocalRef<jobjectArray>;
|
||||
using TScopedLocalIntArrayRef = ScopedLocalRef<jintArray>;
|
||||
using TScopedLocalByteArrayRef = ScopedLocalRef<jbyteArray>;
|
||||
|
||||
jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point);
|
||||
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point);
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point);
|
||||
|
||||
template<typename TValue, typename TToJavaFn>
|
||||
jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, vector<TValue> const & src, TToJavaFn && toJavaFn)
|
||||
{
|
||||
int const size = src.size();
|
||||
auto jArray = env->NewObjectArray(size, clazz, 0);
|
||||
for (size_t i = 0; i < size; i++)
|
||||
{
|
||||
TScopedLocalRef jItem(env, toJavaFn(env, src[i]));
|
||||
env->SetObjectArrayElement(jArray, i, jItem.get());
|
||||
}
|
||||
|
||||
return jArray;
|
||||
}
|
||||
jobjectArray ToJavaStringArray(JNIEnv * env, vector<string> const & src);
|
||||
|
||||
void DumpDalvikReferenceTables();
|
||||
string ToNativeString(JNIEnv * env, jstring str);
|
||||
// Converts UTF-8 array to native UTF-8 string. Result differs from simple GetStringUTFChars call for characters greater than U+10000,
|
||||
// since jni uses modified UTF (MUTF-8) for strings.
|
||||
string ToNativeString(JNIEnv * env, jbyteArray const & utfBytes);
|
||||
jstring ToJavaString(JNIEnv * env, char const * s);
|
||||
inline jstring ToJavaString(JNIEnv * env, string const & s)
|
||||
{
|
||||
return ToJavaString(env, s.c_str());
|
||||
}
|
||||
|
||||
jclass GetStringClass(JNIEnv * env);
|
||||
char const * GetStringClassName();
|
||||
|
||||
string DescribeException();
|
||||
|
||||
shared_ptr<jobject> make_global_ref(jobject obj);
|
||||
using TScopedLocalRef = ScopedLocalRef<jobject>;
|
||||
using TScopedLocalClassRef = ScopedLocalRef<jclass>;
|
||||
using TScopedLocalObjectArrayRef = ScopedLocalRef<jobjectArray>;
|
||||
using TScopedLocalIntArrayRef = ScopedLocalRef<jintArray>;
|
||||
using TScopedLocalByteArrayRef = ScopedLocalRef<jbyteArray>;
|
||||
|
||||
jobject GetNewParcelablePointD(JNIEnv * env, m2::PointD const & point);
|
||||
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointD const & point);
|
||||
jobject GetNewPoint(JNIEnv * env, m2::PointI const & point);
|
||||
|
||||
template<typename TValue, typename TToJavaFn>
|
||||
jobjectArray ToJavaArray(JNIEnv * env, jclass clazz, vector<TValue> const & src, TToJavaFn && toJavaFn)
|
||||
{
|
||||
int const size = src.size();
|
||||
auto jArray = env->NewObjectArray(size, clazz, 0);
|
||||
for (size_t i = 0; i < size; i++)
|
||||
{
|
||||
TScopedLocalRef jItem(env, toJavaFn(env, src[i]));
|
||||
env->SetObjectArrayElement(jArray, i, jItem.get());
|
||||
}
|
||||
|
||||
return jArray;
|
||||
}
|
||||
jobjectArray ToJavaStringArray(JNIEnv * env, vector<string> const & src);
|
||||
|
||||
void DumpDalvikReferenceTables();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue