Home | History | Annotate | Download | only in nativehelper
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef SCOPED_STRING_CHARS_H_included
     18 #define SCOPED_STRING_CHARS_H_included
     19 
     20 #include "JNIHelp.h"
     21 
     22 // A smart pointer that provides access to a jchar* given a JNI jstring.
     23 // Unlike GetStringChars, we throw NullPointerException rather than abort if
     24 // passed a null jstring, and get will return NULL.
     25 // This makes the correct idiom very simple:
     26 //
     27 //   ScopedStringChars name(env, java_name);
     28 //   if (name.get() == NULL) {
     29 //     return NULL;
     30 //   }
     31 class ScopedStringChars {
     32  public:
     33   ScopedStringChars(JNIEnv* env, jstring s) : env_(env), string_(s), size_(0) {
     34     if (s == NULL) {
     35       chars_ = NULL;
     36       jniThrowNullPointerException(env, NULL);
     37     } else {
     38       chars_ = env->GetStringChars(string_, NULL);
     39       if (chars_ != NULL) {
     40         size_ = env->GetStringLength(string_);
     41       }
     42     }
     43   }
     44 
     45   ~ScopedStringChars() {
     46     if (chars_ != NULL) {
     47       env_->ReleaseStringChars(string_, chars_);
     48     }
     49   }
     50 
     51   const jchar* get() const {
     52     return chars_;
     53   }
     54 
     55   size_t size() const {
     56     return size_;
     57   }
     58 
     59   const jchar& operator[](size_t n) const {
     60     return chars_[n];
     61   }
     62 
     63  private:
     64   JNIEnv* env_;
     65   jstring string_;
     66   const jchar* chars_;
     67   size_t size_;
     68 
     69   // Disallow copy and assignment.
     70   ScopedStringChars(const ScopedStringChars&);
     71   void operator=(const ScopedStringChars&);
     72 };
     73 
     74 #endif  // SCOPED_STRING_CHARS_H_included
     75