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
10namespace {
11JavaVM* sVM = NULL;
12
13JavaVM* getJavaVM() {
14  return sVM;
15}
16}
17
18namespace android {
19namespace jni {
20
21// All JNI code assumes this has previously been called with a valid VM
22void SetJavaVM(JavaVM* vm)
23{
24  sVM = vm;
25}
26
27bool 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
38string16 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
52std::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
66JNIEnv* GetJNIEnv() {
67  JNIEnv* env;
68  getJavaVM()->AttachCurrentThread(&env, NULL);
69  return env;
70}
71
72std::string JstringToStdString(JNIEnv* env, jstring jstr) {
73  return jstringToStdString(env, jstr);
74}
75
76string16 JstringToString16(JNIEnv* env, jstring jstr)
77{
78    return jstringToString16(env, jstr);
79}
80
81bool CheckException(JNIEnv* env)
82{
83    return checkException(env);
84}
85
86jstring ConvertUTF8ToJavaString(JNIEnv* env, std::string str)
87{
88    return env->NewStringUTF(str.c_str());
89}
90
91void DetachFromVM()
92{
93    JavaVM* vm = getJavaVM();
94    vm->DetachCurrentThread();
95}
96
97} // namespace jni
98} // namespace android
99
100