diff --git a/android/.classpath b/android/.classpath index 0ca188f976..dec02b33c6 100644 --- a/android/.classpath +++ b/android/.classpath @@ -4,5 +4,6 @@ + diff --git a/android/android.make b/android/android.make index 6d10121952..4c93aa72cc 100644 --- a/android/android.make +++ b/android/android.make @@ -28,16 +28,17 @@ $(CPUFEAT_BUILD)/cpu-features.o: $(CPUFEAT)/cpu-features.c .PHONY: apk classes clean dex dirs libs jar # API version -ANDROID_PLATFORM_VERSION=16 +ANDROID_PLATFORM_VERSION=19 ANDROID_PLATFORM=$(ANDROID_SDK_PATH)/platforms/android-$(ANDROID_PLATFORM_VERSION) # android tools -AAPT=$(ANDROID_SDK_PATH)/platform-tools/aapt -DX=$(ANDROID_SDK_PATH)/platform-tools/dx -APKBUILDER=$(ANDROID_SDK_PATH)/tools/apkbuilder +BUILD_TOOLS_VERSION=19.0.3 +AAPT=$(ANDROID_SDK_PATH)/build-tools/$(BUILD_TOOLS_VERSION)/aapt +DX=$(ANDROID_SDK_PATH)/build-tools/$(BUILD_TOOLS_VERSION)/dx ZIPALIGN=$(ANDROID_SDK_PATH)/tools/zipalign KEYSTORE=$(HOME)/.android/debug.keystore ADB=$(ANDROID_SDK_PATH)/platform-tools/adb +BUILDAPK=$(ANDROID_DIR)/buildapk.sh CLASSPATH := $(BUILDDIR)/bin/classes @@ -130,8 +131,7 @@ $(BINLIB_DIR)/lib%.so: $(RBCODEC_BLD)/codecs/%.codec libs: $(DIRS) $(LIBS) $(TEMP_APK): $(AP_) $(LIBS) $(DEX) | $(DIRS) - $(call PRINTS,APK $(subst $(BUILDDIR)/,,$@))$(APKBUILDER) $@ \ - -u -z $(AP_) -f $(DEX) -nf $(BUILDDIR)/libs + $(call PRINTS,APK $(subst $(BUILDDIR)/,,$@))$(BUILDAPK) $(BUILDDIR) $(notdir $@) $(BUILD_TOOLS_VERSION) $(KEYSTORE): $(SILENT)mkdir -p $(HOME)/.android diff --git a/android/buildapk.sh b/android/buildapk.sh new file mode 100755 index 0000000000..340438721a --- /dev/null +++ b/android/buildapk.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +BUILDDIR=$1 +APK=$2 +SDKV=$3 + +[ -z $ANDROID_SDK_PATH ] && exit 1 +[ -z $BUILDDIR ] && exit 1 +[ -d $BUILDDIR ] || exit 1 + +# need to cd into the bin dir and create a symlink to the libraries +# so that aapt puts the libraries with the correct prefix into the apk +cd $BUILDDIR/bin +ln -nfs $BUILDDIR/libs lib +cp resources.ap_ $APK +$ANDROID_SDK_PATH/build-tools/$SDKV/aapt add $APK classes.dex > /dev/null +$ANDROID_SDK_PATH/build-tools/$SDKV/aapt add $APK lib/*/* > /dev/null + +exit 0 diff --git a/android/project.properties b/android/project.properties index 895c9ce2eb..a5578ba094 100644 --- a/android/project.properties +++ b/android/project.properties @@ -8,4 +8,4 @@ # project structure. # Project target. -target=android-16 +target=android-19 diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java index e1fb99f2a1..405a771274 100644 --- a/android/src/org/rockbox/RockboxFramebuffer.java +++ b/android/src/org/rockbox/RockboxFramebuffer.java @@ -57,14 +57,6 @@ public class RockboxFramebuffer extends SurfaceView setEnabled(false); } - /* second stage init; called from Rockbox with information about the - * display framebuffer */ - private void initialize(int lcd_width, int lcd_height) - { - btm = Bitmap.createBitmap(lcd_width, lcd_height, Bitmap.Config.RGB_565); - setEnabled(true); - } - private void update(ByteBuffer framebuffer) { SurfaceHolder holder = getHolder(); @@ -138,5 +130,7 @@ public class RockboxFramebuffer extends SurfaceView public native void surfaceDestroyed(SurfaceHolder holder); public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + btm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); + setEnabled(true); } } diff --git a/firmware/target/hosted/android/lcd-android.c b/firmware/target/hosted/android/lcd-android.c index 2b383741d1..a161406cc0 100644 --- a/firmware/target/hosted/android/lcd-android.c +++ b/firmware/target/hosted/android/lcd-android.c @@ -34,7 +34,6 @@ extern jobject RockboxService_instance; static jobject RockboxFramebuffer_instance; static jmethodID java_lcd_update; static jmethodID java_lcd_update_rect; -static jmethodID java_lcd_init; static jclass AndroidRect_class; static jmethodID AndroidRect_constructor; @@ -42,6 +41,7 @@ static jmethodID AndroidRect_constructor; static int dpi; static int scroll_threshold; static bool display_on; +static bool connected; /* this might actually be called before lcd_init_device() or even main(), so * be sure to only access static storage initalized at library loading, @@ -49,38 +49,26 @@ static bool display_on; static void connect_with_java(JNIEnv* env, jobject fb_instance) { JNIEnv e = *env; - static bool have_class; - if (!have_class) - { - jclass fb_class = e->GetObjectClass(env, fb_instance); - /* cache update functions */ - java_lcd_update = e->GetMethodID(env, fb_class, - "update", - "(Ljava/nio/ByteBuffer;)V"); - java_lcd_update_rect = e->GetMethodID(env, fb_class, - "update", - "(Ljava/nio/ByteBuffer;" - "Landroid/graphics/Rect;)V"); - jmethodID get_dpi = e->GetMethodID(env, fb_class, - "getDpi", "()I"); - jmethodID thresh = e->GetMethodID(env, fb_class, - "getScrollThreshold", "()I"); - /* these don't change with new instances so call them now */ - dpi = e->CallIntMethod(env, fb_instance, get_dpi); - scroll_threshold = e->CallIntMethod(env, fb_instance, thresh); + jclass fb_class = e->GetObjectClass(env, fb_instance); + /* cache update functions */ + java_lcd_update = e->GetMethodID(env, fb_class, + "update", + "(Ljava/nio/ByteBuffer;)V"); + java_lcd_update_rect = e->GetMethodID(env, fb_class, + "update", + "(Ljava/nio/ByteBuffer;" + "Landroid/graphics/Rect;)V"); + jmethodID get_dpi = e->GetMethodID(env, fb_class, + "getDpi", "()I"); + jmethodID thresh = e->GetMethodID(env, fb_class, + "getScrollThreshold", "()I"); + /* these don't change with new instances so call them now */ + dpi = e->CallIntMethod(env, fb_instance, get_dpi); + scroll_threshold = e->CallIntMethod(env, fb_instance, thresh); - java_lcd_init = e->GetMethodID(env, fb_class, - "initialize", "(II)V"); - AndroidRect_class = e->FindClass(env, "android/graphics/Rect"); - AndroidRect_constructor = e->GetMethodID(env, AndroidRect_class, - "", "(IIII)V"); - have_class = true; - } - - /* we need to setup parts for the java object every time */ - (*env)->CallVoidMethod(env, fb_instance, java_lcd_init, - (jint)LCD_WIDTH, (jint)LCD_HEIGHT); + AndroidRect_constructor = e->GetMethodID(env, AndroidRect_class, + "", "(IIII)V"); } /* @@ -132,12 +120,18 @@ Java_org_rockbox_RockboxFramebuffer_surfaceCreated(JNIEnv *env, jobject this, jobject surfaceholder) { (void)surfaceholder; + jclass rect; /* Update RockboxFramebuffer_instance */ RockboxFramebuffer_instance = (*env)->NewGlobalRef(env, this); - + rect = (*env)->FindClass(env, "android/graphics/Rect"); + AndroidRect_class = (*env)->NewGlobalRef(env, rect); /* possibly a new instance - reconnect */ - connect_with_java(env, this); + if (!connected) + { + connect_with_java(env, this); + connected = true; + } display_on = true; /* need to wait for button_queue to be valid to post to */ @@ -163,6 +157,8 @@ Java_org_rockbox_RockboxFramebuffer_surfaceDestroyed(JNIEnv *e, jobject this, (*e)->DeleteGlobalRef(e, RockboxFramebuffer_instance); RockboxFramebuffer_instance = NULL; + (*e)->DeleteGlobalRef(e, AndroidRect_class); + AndroidRect_class = NULL; } bool lcd_active(void) diff --git a/tools/configure b/tools/configure index 73a8cae42d..5b3419d771 100755 --- a/tools/configure +++ b/tools/configure @@ -673,11 +673,11 @@ androidcc () { LDOPTS="$LDOPTS -Wl,-soname,librockbox.so -shared -ldl -llog" GLOBAL_LDOPTS="-Wl,-z,defs -Wl,-z,noexecstack -shared" ANDROID_ARCH=$1 # for android.make too + gccchoice="4.6" # arch dependant stuff case $ANDROID_ARCH in armeabi) endian="little" - gccchoice="4.4.3" gcctarget="arm-linux-androideabi-" # sigaltstack is not available in pre-android-9, however asm # threads work fine so far @@ -688,7 +688,6 @@ androidcc () { ;; mips) endian="little" - gccchoice="4.4.3" gcctarget="mipsel-linux-android-" thread_support="HAVE_SIGALTSTACK_THREADS" GCCOPTS="$GCCOPTS -march=mips32 -mtune=r4600 -mno-mips16 -mno-long-calls -fomit-frame-pointer \ @@ -696,8 +695,7 @@ androidcc () { LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-14/arch-mips" ;; x86) - endian=little - gccchoice="4.4.3" + endian="little" gcctarget="i686-linux-android-" gccdir=x86-$gccchoice thread_support="HAVE_SIGALTSTACK_THREADS"