jni_string.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/android/jni_string.h" 6 7#include "base/android/jni_android.h" 8#include "base/logging.h" 9#include "base/utf_string_conversions.h" 10 11namespace { 12 13// Internal version that does not use a scoped local pointer. 14jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env, 15 const base::StringPiece16& str) { 16 jstring result = env->NewString(str.data(), str.length()); 17 base::android::CheckException(env); 18 return result; 19} 20 21} 22 23namespace base { 24namespace android { 25 26std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) { 27 // JNI's GetStringUTFChars() returns strings in Java-modified UTF8, so we 28 // instead get the String in UTF16 and convert using our own utility function. 29 return UTF16ToUTF8(ConvertJavaStringToUTF16(env, str)); 30} 31 32std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str) { 33 return ConvertJavaStringToUTF8(AttachCurrentThread(), str.obj()); 34} 35 36ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString( 37 JNIEnv* env, 38 const base::StringPiece& str) { 39 // JNI's NewStringUTF expects "modified" UTF8 so instead create the string 40 // via our own UTF16 conversion utility. 41 // Further, Dalvik requires the string passed into NewStringUTF() to come from 42 // a trusted source. We can't guarantee that all UTF8 will be sanitized before 43 // it gets here, so constructing via UTF16 side-steps this issue. 44 // (Dalvik stores strings internally as UTF16 anyway, so there shouldn't be 45 // a significant performance hit by doing it this way). 46 return ScopedJavaLocalRef<jstring>(env, ConvertUTF16ToJavaStringImpl( 47 env, UTF8ToUTF16(str))); 48} 49 50string16 ConvertJavaStringToUTF16(JNIEnv* env, jstring str) { 51 if (!str) { 52 LOG(WARNING) << " ConvertJavaStringToUTF16 called with null string."; 53 return string16(); 54 } 55 const jchar* chars = env->GetStringChars(str, NULL); 56 DCHECK(chars); 57 // GetStringChars isn't required to NULL-terminate the strings 58 // it returns, so the length must be explicitly checked. 59 string16 result(chars, env->GetStringLength(str)); 60 env->ReleaseStringChars(str, chars); 61 CheckException(env); 62 return result; 63} 64 65string16 ConvertJavaStringToUTF16(const JavaRef<jstring>& str) { 66 return ConvertJavaStringToUTF16(AttachCurrentThread(), str.obj()); 67} 68 69ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString( 70 JNIEnv* env, 71 const base::StringPiece16& str) { 72 return ScopedJavaLocalRef<jstring>(env, 73 ConvertUTF16ToJavaStringImpl(env, str)); 74} 75 76} // namespace android 77} // namespace base 78