summaryrefslogtreecommitdiffstats
path: root/chromium/base/android/jni_string.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/android/jni_string.cc')
-rw-r--r--chromium/base/android/jni_string.cc126
1 files changed, 126 insertions, 0 deletions
diff --git a/chromium/base/android/jni_string.cc b/chromium/base/android/jni_string.cc
new file mode 100644
index 00000000000..9720e2ca73c
--- /dev/null
+++ b/chromium/base/android/jni_string.cc
@@ -0,0 +1,126 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_string.h"
+
+#include "base/android/jni_android.h"
+#include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace {
+
+// Internal version that does not use a scoped local pointer.
+jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env,
+ const base::StringPiece16& str) {
+ jstring result = env->NewString(reinterpret_cast<const jchar*>(str.data()),
+ base::checked_cast<jsize>(str.length()));
+ base::android::CheckException(env);
+ return result;
+}
+
+} // namespace
+
+namespace base {
+namespace android {
+
+void ConvertJavaStringToUTF8(JNIEnv* env, jstring str, std::string* result) {
+ DCHECK(str);
+ if (!str) {
+ LOG(WARNING) << "ConvertJavaStringToUTF8 called with null string.";
+ result->clear();
+ return;
+ }
+ const jsize length = env->GetStringLength(str);
+ if (length <= 0) {
+ result->clear();
+ CheckException(env);
+ return;
+ }
+ // JNI's GetStringUTFChars() returns strings in Java "modified" UTF8, so
+ // instead get the String in UTF16 and convert using chromium's conversion
+ // function that yields plain (non Java-modified) UTF8.
+ const jchar* chars = env->GetStringChars(str, NULL);
+ DCHECK(chars);
+ UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars),
+ static_cast<size_t>(length), result);
+ env->ReleaseStringChars(str, chars);
+ CheckException(env);
+}
+
+std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) {
+ std::string result;
+ ConvertJavaStringToUTF8(env, str, &result);
+ return result;
+}
+
+std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF8(AttachCurrentThread(), str.obj());
+}
+
+std::string ConvertJavaStringToUTF8(JNIEnv* env, const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF8(env, str.obj());
+}
+
+ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(JNIEnv* env,
+ const StringPiece& str) {
+ // JNI's NewStringUTF expects "modified" UTF8 so instead create the string
+ // via our own UTF16 conversion utility.
+ // Further, Dalvik requires the string passed into NewStringUTF() to come from
+ // a trusted source. We can't guarantee that all UTF8 will be sanitized before
+ // it gets here, so constructing via UTF16 side-steps this issue.
+ // (Dalvik stores strings internally as UTF16 anyway, so there shouldn't be
+ // a significant performance hit by doing it this way).
+ return ScopedJavaLocalRef<jstring>(env, ConvertUTF16ToJavaStringImpl(
+ env, UTF8ToUTF16(str)));
+}
+
+void ConvertJavaStringToUTF16(JNIEnv* env,
+ jstring str,
+ std::u16string* result) {
+ DCHECK(str);
+ if (!str) {
+ LOG(WARNING) << "ConvertJavaStringToUTF16 called with null string.";
+ result->clear();
+ return;
+ }
+ const jsize length = env->GetStringLength(str);
+ if (length <= 0) {
+ result->clear();
+ CheckException(env);
+ return;
+ }
+ const jchar* chars = env->GetStringChars(str, NULL);
+ DCHECK(chars);
+ // GetStringChars isn't required to NULL-terminate the strings
+ // it returns, so the length must be explicitly checked.
+ result->assign(reinterpret_cast<const char16_t*>(chars),
+ static_cast<size_t>(length));
+ env->ReleaseStringChars(str, chars);
+ CheckException(env);
+}
+
+std::u16string ConvertJavaStringToUTF16(JNIEnv* env, jstring str) {
+ std::u16string result;
+ ConvertJavaStringToUTF16(env, str, &result);
+ return result;
+}
+
+std::u16string ConvertJavaStringToUTF16(const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF16(AttachCurrentThread(), str.obj());
+}
+
+std::u16string ConvertJavaStringToUTF16(JNIEnv* env,
+ const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF16(env, str.obj());
+}
+
+ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(JNIEnv* env,
+ const StringPiece16& str) {
+ return ScopedJavaLocalRef<jstring>(env,
+ ConvertUTF16ToJavaStringImpl(env, str));
+}
+
+} // namespace android
+} // namespace base