db/Configured: store database file in cache directory

Add class Context which wraps the Android/Java Context class and add a
JNI wrapper for method Context.getCacheDir().
This commit is contained in:
Max Kellermann 2014-03-01 20:20:29 +01:00
parent 5268f55344
commit b8f1850bba
8 changed files with 122 additions and 4 deletions

View File

@ -254,6 +254,7 @@ libjava_a_SOURCES = \
noinst_LIBRARIES += libandroid.a
libandroid_a_SOURCES = \
src/android/Context.cxx src/android/Context.hxx \
src/android/Environment.cxx src/android/Environment.hxx
libandroid_a_CPPFLAGS = $(AM_CPPFLAGS) -Iandroid/build/include

View File

@ -19,9 +19,11 @@
package org.musicpd;
import android.content.Context;
/**
* Bridge to native code.
*/
public class Bridge {
public static native void run();
public static native void run(Context context);
}

View File

@ -57,6 +57,6 @@ public class Main extends Activity implements Runnable {
}
@Override public void run() {
Bridge.run();
Bridge.run(this);
}
}

View File

@ -93,6 +93,7 @@
#include "java/Global.hxx"
#include "java/File.hxx"
#include "android/Environment.hxx"
#include "android/Context.hxx"
#include "org_musicpd_Bridge.h"
#endif
@ -118,6 +119,10 @@ static constexpr unsigned DEFAULT_BUFFER_BEFORE_PLAY = 10;
static constexpr Domain main_domain("main");
#ifdef ANDROID
Context *context;
#endif
Instance *instance;
static StateFile *state_file;
@ -679,14 +684,17 @@ int mpd_main(int argc, char *argv[])
gcc_visibility_default
JNIEXPORT void JNICALL
Java_org_musicpd_Bridge_run(JNIEnv *env, jclass)
Java_org_musicpd_Bridge_run(JNIEnv *env, jclass, jobject _context)
{
Java::Init(env);
Java::File::Initialise(env);
Environment::Initialise(env);
context = new Context(env, _context);
mpd_main(0, nullptr);
delete context;
Environment::Deinitialise(env);
}

View File

@ -21,8 +21,13 @@
#define MPD_MAIN_HXX
class EventLoop;
class Context;
struct Instance;
#ifdef ANDROID
extern Context *context;
#endif
extern Instance *instance;
#ifndef ANDROID

43
src/android/Context.cxx Normal file
View File

@ -0,0 +1,43 @@
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "Context.hxx"
#include "java/Class.hxx"
#include "java/File.hxx"
#include "fs/AllocatedPath.hxx"
AllocatedPath
Context::GetCacheDir(JNIEnv *env) const
{
assert(env != nullptr);
Java::Class cls(env, env->GetObjectClass(Get()));
jmethodID method = env->GetMethodID(cls, "getCacheDir",
"()Ljava/io/File;");
assert(method);
jobject file = env->CallObjectMethod(Get(), method);
if (file == nullptr) {
env->ExceptionClear();
return AllocatedPath::Null();
}
return Java::File::ToAbsolutePath(env, file);
}

35
src/android/Context.hxx Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_ANDROID_CONTEXT_HXX
#define MPD_ANDROID_CONTEXT_HXX
#include "java/Object.hxx"
class AllocatedPath;
class Context : public Java::Object {
public:
Context(JNIEnv *env, jobject obj):Java::Object(env, obj) {}
gcc_pure
AllocatedPath GetCacheDir(JNIEnv *env) const;
};
#endif

View File

@ -26,6 +26,13 @@
#include "util/Error.hxx"
#include "Log.hxx"
#ifdef ANDROID
#include "Main.hxx"
#include "android/Context.hxx"
#include "fs/AllocatedPath.hxx"
#include "plugins/simple/SimpleDatabasePlugin.hxx"
#endif
Database *
CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener,
Error &error)
@ -49,9 +56,26 @@ CreateConfiguredDatabase(EventLoop &loop, DatabaseListener &listener,
param = allocated;
}
if (param == nullptr)
if (param == nullptr) {
#ifdef ANDROID
/* if there is no override, use the Android cache
directory */
const AllocatedPath cache_dir =
context->GetCacheDir(Java::GetEnv());
if (cache_dir.IsNull())
return nullptr;
const auto db_file = AllocatedPath::Build(cache_dir, "mpd.db");
allocated = new config_param("database");
allocated->AddBlockParam("path", db_file.c_str(), -1);
param = allocated;
#else
return nullptr;
#endif
}
Database *db = DatabaseGlobalInit(loop, listener, *param,
error);
delete allocated;