Skip to content

Commit

Permalink
Merge branch 'dhewg-android'
Browse files Browse the repository at this point in the history
  • Loading branch information
dhewg committed Feb 18, 2011
2 parents 8a50789 + 2586e15 commit 8cddb2a
Show file tree
Hide file tree
Showing 14 changed files with 294 additions and 188 deletions.
5 changes: 1 addition & 4 deletions .gitignore
Expand Up @@ -22,9 +22,6 @@ lib*.a
/.project
/.cproject

/backends/platform/android/org/inodes/gus/scummvm/R.java
/backends/platform/android/org/inodes/gus/scummvm/Manifest.java

/backends/platform/dc/gui
/backends/platform/dc/graphics
/backends/platform/dc/sound
Expand Down Expand Up @@ -143,4 +140,4 @@ ipch/

#Ignore default Visual Studio build folders
[Dd]ebug/
[Rr]elease/
[Rr]elease/
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -76,7 +76,7 @@ ZIP ?= zip -q
# Misc stuff - you should never have to edit this #
#######################################################################

EXECUTABLE := scummvm$(EXEEXT)
EXECUTABLE := $(EXEPRE)scummvm$(EXEEXT)

include $(srcdir)/Makefile.common

Expand Down
57 changes: 41 additions & 16 deletions backends/platform/android/android.cpp
Expand Up @@ -23,14 +23,14 @@
*
*/

#if defined(__ANDROID__)

#include "backends/base-backend.h"
#include "base/main.h"
#include "graphics/surface.h"

#include "backends/platform/android/video.h"

#if defined(ANDROID_BACKEND)

#include <jni.h>

#include <string.h>
Expand Down Expand Up @@ -73,12 +73,20 @@
#undef JNIEXPORT
#define JNIEXPORT __attribute__ ((visibility("default")))

// This replaces the bionic libc assert message with something that
// This replaces the bionic libc assert functions with something that
// actually prints the assertion failure before aborting.
extern "C"
void __assert(const char *file, int line, const char *expr) {
__android_log_assert(expr, LOG_TAG, "%s:%d: Assertion failure: %s",
file, line, expr);
extern "C" {
void __assert(const char *file, int line, const char *expr) {
__android_log_assert(expr, LOG_TAG,
"Assertion failure: '%s' in %s:%d",
expr, file, line);
}

void __assert2(const char *file, int line, const char *func, const char *expr) {
__android_log_assert(expr, LOG_TAG,
"Assertion failure: '%s' in %s:%d (%s)",
expr, file, line, func);
}
}

static JavaVM *cached_jvm;
Expand All @@ -94,10 +102,14 @@ static jfieldID FID_ScummVM_nativeScummVM;
static jmethodID MID_Object_wait;

JNIEnv* JNU_GetEnv() {
JNIEnv* env;
bool version_unsupported =
cached_jvm->GetEnv((void**)&env, JNI_VERSION_1_2);
assert(! version_unsupported);
JNIEnv* env = 0;

jint res = cached_jvm->GetEnv((void**)&env, JNI_VERSION_1_2);
if (res != JNI_OK) {
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "GetEnv() failed: %d", res);
abort();
}

return env;
}

Expand Down Expand Up @@ -445,6 +457,14 @@ void* OSystem_Android::timerThreadFunc(void* arg) {
OSystem_Android* system = (OSystem_Android*)arg;
DefaultTimerManager* timer = (DefaultTimerManager*)(system->_timer);

JNIEnv *env = 0;
jint res = cached_jvm->AttachCurrentThread(&env, 0);

if (res != JNI_OK) {
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "AttachCurrentThread() failed: %d", res);
abort();
}

struct timespec tv;
tv.tv_sec = 0;
tv.tv_nsec = 100 * 1000 * 1000; // 100ms
Expand All @@ -454,6 +474,13 @@ void* OSystem_Android::timerThreadFunc(void* arg) {
nanosleep(&tv, NULL);
}

res = cached_jvm->DetachCurrentThread();

if (res != JNI_OK) {
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "DetachCurrentThread() failed: %d", res);
abort();
}

return NULL;
}

Expand Down Expand Up @@ -1276,17 +1303,15 @@ void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s,
void OSystem_Android::logMessage(LogMessageType::Type type, const char *message) {
switch (type) {
case LogMessageType::kDebug:
BaseBackend::logMessage(type, message);
__android_log_write(ANDROID_LOG_DEBUG, LOG_TAG, message);
break;

case LogMessageType::kWarning:
__android_log_write(ANDROID_LOG_WARN, "ScummVM", message);
__android_log_write(ANDROID_LOG_WARN, LOG_TAG, message);
break;

case LogMessageType::kError:
// FIXME: From the name it looks like this will also quit the program.
// This shouldn't do that though.
__android_log_assert("Fatal error", "ScummVM", "%s", message);
__android_log_write(ANDROID_LOG_ERROR, LOG_TAG, message);
break;
}
}
Expand Down
184 changes: 149 additions & 35 deletions backends/platform/android/android.mk
@@ -1,59 +1,173 @@
# Android specific build targets

AAPT = aapt
DX = dx
APKBUILDER = apkbuilder
ADB = adb -e
JAVAC ?= javac
JAVACFLAGS = -source 1.5 -target 1.5
# These must be incremented for each market upload
#ANDROID_VERSIONCODE = 6 Specified in dists/android/AndroidManifest.xml.in
ANDROID_PLUGIN_VERSIONCODE = 6

JAVA_FILES = \
ScummVM.java \
ScummVMApplication.java \
ScummVMActivity.java \
EditableSurfaceView.java \
Unpacker.java

JAVA_FILES_PLUGIN = \
PluginProvider.java

JAVA_FILES_GEN = \
Manifest.java \
R.java

PATH_DIST = $(srcdir)/dists/android
PATH_RESOURCES = $(PATH_DIST)/res

RESOURCES = \
$(PATH_RESOURCES)/values/strings.xml \
$(PATH_RESOURCES)/layout/main.xml \
$(PATH_RESOURCES)/layout/splash.xml \
$(PATH_RESOURCES)/drawable/gradient.xml \
$(PATH_RESOURCES)/drawable/scummvm.png \
$(PATH_RESOURCES)/drawable/scummvm_big.png

PLUGIN_RESOURCES = \
$(PATH_RESOURCES)/values/strings.xml \
$(PATH_RESOURCES)/drawable/scummvm.png

# FIXME: find/mark plugin entry points and add all this back again:
#LDFLAGS += -Wl,--gc-sections
#CXXFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden

resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR8) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA)
$(INSTALL) -d build.tmp/assets/
$(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/
$(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR8) -F $@

build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR8)
$(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR8) -F $@

scummvm.apk: build.tmp/libscummvm.so resources.ap_ classes.dex
# Package installer won't delete old libscummvm.so on upgrade so
# replace it with a zero size file
$(INSTALL) -d build.stage/common/lib/armeabi
touch build.stage/common/lib/armeabi/libscummvm.so
# We now handle the library unpacking ourselves from mylib/
$(INSTALL) -d build.stage/common/mylib/armeabi
$(INSTALL) -c -m 644 build.tmp/libscummvm.so build.stage/common/mylib/armeabi/
$(STRIP) build.stage/common/mylib/armeabi/libscummvm.so
# "-nf lib/armeabi/libscummvm.so" builds bogus paths?
$(APKBUILDER) $@ -z resources.ap_ -f classes.dex -rf build.stage/common || { $(RM) $@; exit 1; }

scummvm-engine-%.apk: plugins/lib%.so build.tmp/%/resources.ap_ build.tmp/plugins/classes.dex
$(INSTALL) -d build.stage/$*/apk/mylib/armeabi/
$(INSTALL) -c -m 644 plugins/lib$*.so build.stage/$*/apk/mylib/armeabi/
$(STRIP) build.stage/$*/apk/mylib/armeabi/lib$*.so
$(APKBUILDER) $@ -z build.tmp/$*/resources.ap_ -f build.tmp/plugins/classes.dex -rf build.stage/$*/apk || { $(RM) $@; exit 1; }
AAPT = $(ANDROID_SDK)/platform-tools/aapt
ADB = $(ANDROID_SDK)/platform-tools/adb
DX = $(ANDROID_SDK)/platform-tools/dx
APKBUILDER = $(ANDROID_SDK)/tools/apkbuilder
JAVAC ?= javac
JAVACFLAGS = -source 1.5 -target 1.5

# This is a bit silly. I want to compile against the 1.6 android.jar,
# to make the compiler check that I don't use something that requires
# a newer Android. However, in order to use android:installLocation,
# we need to give aapt a version >=8 android.jar - even though the
# result will work ok on 1.5+.
ANDROID_JAR = $(ANDROID_SDK)/platforms/android-4/android.jar
ANDROID_JAR8 = $(ANDROID_SDK)/platforms/android-8/android.jar

PATH_BUILD = build.tmp
PATH_BUILD_ASSETS = $(PATH_BUILD)/assets
PATH_BUILD_CLASSES_MAIN_TOP = $(PATH_BUILD)/classes.main
PATH_BUILD_CLASSES_PLUGIN_TOP = $(PATH_BUILD)/classes.plugin

PATH_STAGE_PREFIX = build.stage
PATH_STAGE_MAIN = $(PATH_STAGE_PREFIX).main

PATH_REL = org/inodes/gus/scummvm
PATH_SRC_TOP = $(srcdir)/backends/platform/android
PATH_SRC = $(PATH_SRC_TOP)/$(PATH_REL)

PATH_GEN_TOP = $(PATH_BUILD)/java
PATH_GEN = $(PATH_GEN_TOP)/$(PATH_REL)
PATH_CLASSES_MAIN = $(PATH_BUILD_CLASSES_MAIN_TOP)/$(PATH_REL)
PATH_CLASSES_PLUGIN = $(PATH_BUILD_CLASSES_PLUGIN_TOP)/$(PATH_REL)

FILE_MANIFEST = $(srcdir)/dists/android/AndroidManifest.xml
FILE_DEX = $(PATH_BUILD)/classes.dex
FILE_DEX_PLUGIN = $(PATH_BUILD)/plugins/classes.dex
FILE_RESOURCES = resources.ap_
FILE_RESOURCES_MAIN = $(PATH_BUILD)/$(FILE_RESOURCES)

SRC_GEN = $(addprefix $(PATH_GEN)/, $(JAVA_FILES_GEN))

CLASSES_MAIN = $(addprefix $(PATH_CLASSES_MAIN)/, $(JAVA_FILES:%.java=%.class))
CLASSES_GEN = $(addprefix $(PATH_CLASSES_MAIN)/, $(JAVA_FILES_GEN:%.java=%.class))
CLASSES_PLUGIN = $(addprefix $(PATH_CLASSES_PLUGIN)/, $(JAVA_FILES_PLUGIN:%.java=%.class))

APK_MAIN = scummvm.apk
APK_PLUGINS = $(patsubst plugins/lib%.so, scummvm-engine-%.apk, $(PLUGINS))

$(SRC_GEN): $(FILE_MANIFEST) $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR8)
@$(MKDIR) -p $(PATH_GEN_TOP)
$(AAPT) package -m -J $(PATH_GEN_TOP) -M $< -S $(PATH_RESOURCES) -I $(ANDROID_JAR8)

$(PATH_CLASSES_MAIN)/%.class: $(PATH_GEN)/%.java $(SRC_GEN)
@$(MKDIR) -p $(@D)
$(JAVAC) $(JAVACFLAGS) -cp $(PATH_SRC_TOP) -d $(PATH_BUILD_CLASSES_MAIN_TOP) -bootclasspath $(ANDROID_JAR) $<

$(PATH_CLASSES_MAIN)/%.class: $(PATH_SRC)/%.java $(SRC_GEN)
@$(MKDIR) -p $(@D)
$(JAVAC) $(JAVACFLAGS) -cp $(PATH_SRC_TOP):$(PATH_GEN_TOP) -d $(PATH_BUILD_CLASSES_MAIN_TOP) -bootclasspath $(ANDROID_JAR) $<

$(PATH_CLASSES_PLUGIN)/%.class: $(PATH_SRC)/%.java
@$(MKDIR) -p $(@D)
$(JAVAC) $(JAVACFLAGS) -cp $(PATH_SRC_TOP) -d $(PATH_BUILD_CLASSES_PLUGIN_TOP) -bootclasspath $(ANDROID_JAR) $<

$(FILE_DEX): $(CLASSES_MAIN) $(CLASSES_GEN)
$(DX) --dex --output=$@ $(PATH_BUILD_CLASSES_MAIN_TOP)

$(FILE_DEX_PLUGIN): $(CLASSES_PLUGIN)
@$(MKDIR) -p $(@D)
$(DX) --dex --output=$@ $(PATH_BUILD_CLASSES_PLUGIN_TOP)

$(PATH_BUILD)/%/AndroidManifest.xml $(PATH_STAGE_PREFIX).%/res/values/strings.xml: $(PATH_DIST)/mkmanifest.pl $(srcdir)/configure $(PATH_DIST)/AndroidManifest.xml
$(PATH_DIST)/mkmanifest.pl --id=$* --configure=$(srcdir)/configure \
--version-name=$(VERSION) \
--version-code=$(ANDROID_PLUGIN_VERSIONCODE) \
--stringres=$(PATH_STAGE_PREFIX).$*/res/values/strings.xml \
--manifest=$(PATH_BUILD)/$*/AndroidManifest.xml \
--master-manifest=$(PATH_DIST)/AndroidManifest.xml \
--unpacklib=mylib/armeabi/lib$*.so

$(PATH_STAGE_PREFIX).%/res/drawable/scummvm.png: $(PATH_RESOURCES)/drawable/scummvm.png
@$(MKDIR) -p $(@D)
$(CP) $< $@

$(FILE_RESOURCES_MAIN): $(FILE_MANIFEST) $(RESOURCES) $(ANDROID_JAR8) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA)
$(INSTALL) -d $(PATH_BUILD_ASSETS)
$(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(PATH_BUILD_ASSETS)/
$(AAPT) package -f -M $< -S $(PATH_RESOURCES) -A $(PATH_BUILD_ASSETS) -I $(ANDROID_JAR8) -F $@

$(PATH_BUILD)/%/$(FILE_RESOURCES): $(PATH_BUILD)/%/AndroidManifest.xml $(PATH_STAGE_PREFIX).%/res/values/strings.xml $(PATH_STAGE_PREFIX).%/res/drawable/scummvm.png $(ANDROID_JAR8)
$(AAPT) package -f -M $< -S $(PATH_STAGE_PREFIX).$*/res -I $(ANDROID_JAR8) -F $@

# Package installer won't delete old libscummvm.so on upgrade so
# replace it with a zero size file
$(APK_MAIN): $(EXECUTABLE) $(FILE_RESOURCES_MAIN) $(FILE_DEX)
$(INSTALL) -d $(PATH_STAGE_MAIN)/common/lib/armeabi
touch $(PATH_STAGE_MAIN)/common/lib/armeabi/libscummvm.so
$(INSTALL) -d $(PATH_STAGE_MAIN)/common/mylib/armeabi
$(INSTALL) -c -m 644 libscummvm.so $(PATH_STAGE_MAIN)/common/mylib/armeabi/
$(STRIP) $(PATH_STAGE_MAIN)/common/mylib/armeabi/libscummvm.so
$(APKBUILDER) $@ -z $(FILE_RESOURCES_MAIN) -f $(FILE_DEX) -rf $(PATH_STAGE_MAIN)/common || { $(RM) $@; exit 1; }

scummvm-engine-%.apk: plugins/lib%.so $(PATH_BUILD)/%/$(FILE_RESOURCES) $(FILE_DEX_PLUGIN)
$(INSTALL) -d $(PATH_STAGE_PREFIX).$*/apk/mylib/armeabi/
$(INSTALL) -c -m 644 plugins/lib$*.so $(PATH_STAGE_PREFIX).$*/apk/mylib/armeabi/
$(STRIP) $(PATH_STAGE_PREFIX).$*/apk/mylib/armeabi/lib$*.so
$(APKBUILDER) $@ -z $(PATH_BUILD)/$*/$(FILE_RESOURCES) -f $(FILE_DEX_PLUGIN) -rf $(PATH_STAGE_PREFIX).$*/apk || { $(RM) $@; exit 1; }

all: $(APK_MAIN) $(APK_PLUGINS)

clean: androidclean

androidclean:
@$(RM) -rf $(PATH_BUILD) $(PATH_STAGE_PREFIX).* *.apk release

# remove debugging signature
release/%.apk: %.apk
@$(MKDIR) -p $(@D)
@$(RM) $@
$(CP) $< $@.tmp
# remove debugging signature
zip -d $@.tmp META-INF/\*
jarsigner $(JARSIGNER_FLAGS) $@.tmp release
zipalign 4 $@.tmp $@
$(RM) $@.tmp

androidrelease: release/scummvm.apk $(patsubst plugins/lib%.so,release/scummvm-engine-%.apk,$(PLUGINS))
androidrelease: $(addprefix release/, $(APK_MAIN) $(APK_PLUGINS))

androidtest: scummvm.apk scummvm-engine-scumm.apk scummvm-engine-kyra.apk
androidtest: $(APK_MAIN) $(APK_PLUGINS)
@set -e; for apk in $^; do \
echo $(ADB) install -r $$apk; \
$(ADB) install -r $$apk; \
done
$(ADB) shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n org.inodes.gus.scummvm/.Unpacker

.PHONY: androidrelease androidtest

2 changes: 1 addition & 1 deletion backends/platform/android/asset-archive.cpp
Expand Up @@ -23,7 +23,7 @@
*
*/

#if defined(ANDROID)
#if defined(__ANDROID__)

#include <jni.h>

Expand Down
2 changes: 1 addition & 1 deletion backends/platform/android/asset-archive.h
Expand Up @@ -23,7 +23,7 @@
*
*/

#if defined(ANDROID)
#if defined(__ANDROID__)

#include <jni.h>

Expand Down

0 comments on commit 8cddb2a

Please sign in to comment.