Browse Source

android: open files through the asset manager, meaning Lua works.

legacy
Sam Hocevar sam 11 years ago
parent
commit
d4372a6a1e
4 changed files with 51 additions and 13 deletions
  1. +13
    -5
      build/android/LolActivity.java
  2. +6
    -1
      src/platform/android/androidapp.cpp
  3. +19
    -0
      src/sys/file.cpp
  4. +13
    -7
      src/sys/init.cpp

+ 13
- 5
build/android/LolActivity.java View File

@@ -10,7 +10,8 @@

package net.lolengine;

import android.app.NativeActivity;
import android.app.NativeActivity; /* NativeActivity */
import android.os.Bundle; /* Bundle */

import android.content.res.AssetManager; /* getAssets() */
import android.graphics.Bitmap;
@@ -26,12 +27,19 @@ public class LolActivity extends NativeActivity
System.loadLibrary("@PROGRAM@");
}

public LolActivity()
@Override
protected void onCreate(Bundle saved_instance)
{
nativeInit();
super.onCreate(saved_instance);

m_assets = getAssets();

nativeInit(m_assets);
}

private native void nativeInit();
private native void nativeInit(AssetManager assets);

private AssetManager m_assets;

/*
* Bitmap loading helpers
@@ -41,7 +49,7 @@ public class LolActivity extends NativeActivity
{
try
{
return BitmapFactory.decodeStream(getAssets().open(name));
return BitmapFactory.decodeStream(m_assets.open(name));
}
catch (Exception e) { }
return null;


+ 6
- 1
src/platform/android/androidapp.cpp View File

@@ -15,6 +15,7 @@
#if defined __ANDROID__

#include <jni.h>
#include <android/asset_manager_jni.h>

#include <EGL/egl.h>
#include <GLES/gl.h>
@@ -33,6 +34,7 @@ namespace lol
{
JavaVM *g_vm;
jobject g_activity;
AAssetManager *g_assets;
}; /* namespace lol */

extern "C" jint
@@ -44,11 +46,14 @@ JNI_OnLoad(JavaVM* vm, void* reserved)
}

extern "C" void
Java_net_lolengine_LolActivity_nativeInit(JNIEnv* env, jobject thiz)
Java_net_lolengine_LolActivity_nativeInit(JNIEnv* env, jobject thiz,
jobject assets)
{
Log::Info("Java layer initialising activity 0x%08lx", (long)thiz);
env->NewGlobalRef(thiz); /* FIXME: never released! */
g_activity = thiz;
env->NewGlobalRef(assets); /* FIXME: never released! */
g_assets = AAssetManager_fromJava(env, assets);
}

/* One of these wrappers will be overridden by the user's version */


+ 19
- 0
src/sys/file.cpp View File

@@ -15,6 +15,8 @@
#if __CELLOS_LV2__
# include <sys/paths.h>
# include <cell/cell_fs.h>
#elif __ANDROID__
# include <android/asset_manager_jni.h>
#endif

#include "core.h"
@@ -22,6 +24,10 @@
namespace lol
{

#if __ANDROID__
extern AAssetManager *g_assets;
#endif

class FileData
{
friend class File;
@@ -34,6 +40,8 @@ class FileData
&m_fd, NULL, 0);
if (err != CELL_FS_SUCCEEDED)
m_fd = -1;
#elif __ANDROID__
m_asset = AAssetManager_open(g_assets, file.C(), AASSET_MODE_UNKNOWN);
#elif HAVE_STDIO_H
/* FIXME: no modes, no error checking, no nothing */
m_fd = fopen(file.C(), "r");
@@ -44,6 +52,8 @@ class FileData
{
#if __CELLOS_LV2__
return m_fd > -1;
#elif __ANDROID__
return !!m_asset;
#elif HAVE_STDIO_H
return !!m_fd;
#else
@@ -61,6 +71,8 @@ class FileData
return -1;

return (int)done;
#elif __ANDROID__
return AAsset_read(m_asset, buf, count);
#elif HAVE_STDIO_H
size_t done = fread(buf, 1, count, m_fd);
if (done <= 0)
@@ -98,6 +110,11 @@ class FileData
#if __CELLOS_LV2__
if (m_fd >= 0)
cellFsClose(m_fd);
m_fd = -1;
#elif __ANDROID__
if (m_asset)
AAsset_close(m_asset);
m_asset = nullptr;
#elif HAVE_STDIO_H
if (m_fd)
fclose(m_fd);
@@ -107,6 +124,8 @@ class FileData

#if __CELLOS_LV2__
int m_fd;
#elif __ANDROID__
AAsset *m_asset;
#elif HAVE_STDIO_H
FILE *m_fd;
#endif


+ 13
- 7
src/sys/init.cpp View File

@@ -48,15 +48,21 @@ void Init(int argc, char *argv[],
* Retrieve binary directory, defaulting to current dir.
*/

#if defined HAVE_GETCWD
#if __ANDROID__
/* Android assets are accessed using no prefix at all. */
String binarydir = "";
#elif defined HAVE_GETCWD
char *cwd = getcwd(nullptr, 0);
String binarydir = String(cwd ? cwd : ".") + SEPARATOR;
free(cwd);
#elif defined HAVE__GETCWD || (defined _WIN32 && !defined _XBOX)
char *cwd = _getcwd(nullptr, 0);
#else
char *cwd = nullptr;
#endif
String binarydir = String(cwd ? cwd : ".") + SEPARATOR;
free(cwd);
#else
String binarydir = "./";
#endif

if (argc > 0)
{
char const *last_sep = strrchr(argv[0], SEPARATOR);
@@ -99,7 +105,7 @@ void Init(int argc, char *argv[],
if (!got_rootdir)
{
String rootdir = binarydir;
if (rootdir.Last() != SEPARATOR)
if (rootdir.Count() && rootdir.Last() != SEPARATOR)
rootdir += SEPARATOR;
for (int i = 1; i < sourcesubdir.Count(); ++i)
{
@@ -117,9 +123,9 @@ void Init(int argc, char *argv[],
got_rootdir = true;
}

Log::Debug("binary dir: %s\n", binarydir.C());
Log::Debug("binary dir: %s\n", binarydir.C());
for (int i = 0; i < data_dir.Count(); ++i)
Log::Debug("data dir %d/%d: %s\n", i + 1, data_dir.Count(),
Log::Debug("data dir %d/%d: %s\n", i + 1, data_dir.Count(),
data_dir[i].C());
}



Loading…
Cancel
Save