blob: 166e894749cfdb669aa4f634d9486cfc7d2cc22e [file] [log] [blame]
#include <jni.h>
#include <log/log.h>
#include "unicode/locid.h"
namespace android {
extern int register_android_database_CursorWindow(JNIEnv* env);
extern int register_android_database_SQLiteConnection(JNIEnv* env);
} // namespace android
/*
* JNI Initialization
*/
jint JNI_OnLoad(JavaVM* jvm, void* reserved) {
JNIEnv* env;
ALOGV("loading JNI\n");
// Check JNI version
if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_4)) {
ALOGE("JNI version mismatch error");
return JNI_ERR;
}
if (android::register_android_database_CursorWindow(env) != JNI_VERSION_1_4 ||
android::register_android_database_SQLiteConnection(env) !=
JNI_VERSION_1_4) {
ALOGE("Failure during registration");
return JNI_ERR;
}
// Configuration is stored as java System properties.
// Get a reference to System.getProperty
jclass systemClass = env->FindClass("java/lang/System");
jmethodID getPropertyMethod = env->GetStaticMethodID(
systemClass, "getProperty",
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
// Set the default locale, which is required for e.g. SQLite's 'COLLATE
// UNICODE'.
auto stringLanguageTag = (jstring)env->CallStaticObjectMethod(
systemClass, getPropertyMethod,
env->NewStringUTF("robolectric.nativeruntime.languageTag"),
env->NewStringUTF(""));
const char* languageTag = env->GetStringUTFChars(stringLanguageTag, 0);
int languageTagLength = env->GetStringLength(stringLanguageTag);
if (languageTagLength > 0) {
UErrorCode status = U_ZERO_ERROR;
icu::Locale locale = icu::Locale::forLanguageTag(languageTag, status);
if (U_SUCCESS(status)) {
icu::Locale::setDefault(locale, status);
}
if (U_FAILURE(status)) {
fprintf(stderr,
"Failed to set the ICU default locale to '%s' (error code %d)\n",
languageTag, status);
}
}
env->ReleaseStringUTFChars(stringLanguageTag, languageTag);
return JNI_VERSION_1_4;
}