From 58771fc41c411769d3ab7248c7fab00e8dbbecef Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 1 Mar 2014 17:46:59 +0100 Subject: Android: obtain music directory from Environment.getExternalStoragePublicDirectory() --- src/android/Environment.cxx | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/android/Environment.cxx (limited to 'src/android/Environment.cxx') diff --git a/src/android/Environment.cxx b/src/android/Environment.cxx new file mode 100644 index 000000000..40f4cfd41 --- /dev/null +++ b/src/android/Environment.cxx @@ -0,0 +1,117 @@ +/* +Copyright_License { + + XCSoar Glide Computer - http://www.xcsoar.org/ + Copyright (C) 2000-2013 The XCSoar Project + A detailed list of copyright holders can be found in the file "AUTHORS". + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +*/ + +#include "Environment.hxx" +#include "java/Class.hxx" +#include "java/String.hxx" +#include "java/File.hxx" +#include "util/StringUtil.hxx" + +namespace Environment { + static Java::TrivialClass cls; + static jmethodID getExternalStorageDirectory_method; + static jmethodID getExternalStoragePublicDirectory_method; + + static jstring getExternalStorageDirectory(JNIEnv *env); +}; + +void +Environment::Initialise(JNIEnv *env) +{ + cls.Find(env, "android/os/Environment"); + + getExternalStorageDirectory_method = + env->GetStaticMethodID(cls, "getExternalStorageDirectory", + "()Ljava/io/File;"); + + getExternalStoragePublicDirectory_method = + env->GetStaticMethodID(cls, "getExternalStoragePublicDirectory", + "(Ljava/lang/String;)Ljava/io/File;"); +} + +void +Environment::Deinitialise(JNIEnv *env) +{ + cls.Clear(env); +} + +static jstring +ToAbsolutePathChecked(JNIEnv *env, jobject file) +{ + if (file == nullptr) + return nullptr; + + jstring path = Java::File::getAbsolutePath(env, file); + env->DeleteLocalRef(file); + return path; +} + +static jstring +Environment::getExternalStorageDirectory(JNIEnv *env) +{ + jobject file = env->CallStaticObjectMethod(cls, + getExternalStorageDirectory_method); + return ToAbsolutePathChecked(env, file); +} + +char * +Environment::getExternalStorageDirectory(char *buffer, size_t max_size) +{ + JNIEnv *env = Java::GetEnv(); + + jstring value = getExternalStorageDirectory(env); + if (value == nullptr) + return nullptr; + + Java::String value2(env, value); + value2.CopyTo(env, buffer, max_size); + return buffer; +} + +static jstring +getExternalStoragePublicDirectory(JNIEnv *env, const char *type) +{ + if (Environment::getExternalStoragePublicDirectory_method == nullptr) + /* needs API level 8 */ + return nullptr; + + Java::String type2(env, type); + jobject file = env->CallStaticObjectMethod(Environment::cls, + Environment::getExternalStoragePublicDirectory_method, + type2.Get()); + return ToAbsolutePathChecked(env, file); +} + +char * +Environment::getExternalStoragePublicDirectory(char *buffer, size_t max_size, + const char *type) +{ + JNIEnv *env = Java::GetEnv(); + jstring path = ::getExternalStoragePublicDirectory(env, type); + if (path == nullptr) + return nullptr; + + Java::String path2(env, path); + path2.CopyTo(env, buffer, max_size); + return buffer; +} -- cgit v1.2.3