1 // Copyright (c) 2010 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 "android/jni/jni_utils.h" 6 #include "base/logging.h" 7 #include "base/utf_string_conversions.h" 8 #include "jni.h" 9 10 namespace { 11 JavaVM* sVM = NULL; 12 13 JavaVM* getJavaVM() { 14 return sVM; 15 } 16 } 17 18 namespace android { 19 namespace jni { 20 21 // All JNI code assumes this has previously been called with a valid VM 22 void SetJavaVM(JavaVM* vm) 23 { 24 sVM = vm; 25 } 26 27 bool checkException(JNIEnv* env) 28 { 29 if (env->ExceptionCheck() != 0) 30 { 31 LOG(ERROR) << "*** Uncaught exception returned from Java call!\n"; 32 env->ExceptionDescribe(); 33 return true; 34 } 35 return false; 36 } 37 38 string16 jstringToString16(JNIEnv* env, jstring jstr) 39 { 40 if (!jstr || !env) 41 return string16(); 42 43 const char* s = env->GetStringUTFChars(jstr, 0); 44 if (!s) 45 return string16(); 46 string16 str = UTF8ToUTF16(s); 47 env->ReleaseStringUTFChars(jstr, s); 48 checkException(env); 49 return str; 50 } 51 52 std::string jstringToStdString(JNIEnv* env, jstring jstr) 53 { 54 if (!jstr || !env) 55 return std::string(); 56 57 const char* s = env->GetStringUTFChars(jstr, 0); 58 if (!s) 59 return std::string(); 60 std::string str(s); 61 env->ReleaseStringUTFChars(jstr, s); 62 checkException(env); 63 return str; 64 } 65 66 JNIEnv* GetJNIEnv() { 67 JNIEnv* env; 68 getJavaVM()->AttachCurrentThread(&env, NULL); 69 return env; 70 } 71 72 std::string JstringToStdString(JNIEnv* env, jstring jstr) { 73 return jstringToStdString(env, jstr); 74 } 75 76 string16 JstringToString16(JNIEnv* env, jstring jstr) 77 { 78 return jstringToString16(env, jstr); 79 } 80 81 bool CheckException(JNIEnv* env) 82 { 83 return checkException(env); 84 } 85 86 jstring ConvertUTF8ToJavaString(JNIEnv* env, std::string str) 87 { 88 return env->NewStringUTF(str.c_str()); 89 } 90 91 void DetachFromVM() 92 { 93 JavaVM* vm = getJavaVM(); 94 vm->DetachCurrentThread(); 95 } 96 97 } // namespace jni 98 } // namespace android 99 100