summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2014-03-09 18:08:06 +0100
committerThomas Martitz <kugel@rockbox.org>2014-03-09 18:11:35 +0100
commit6499ce3e445e1acc5f5707fd164ad5e3c5ab0a43 (patch)
tree3e1cb19678e5ce9bfd5681d944193ede902805b6
parent2a71c0853304b68835fcf87d2bae8295d64abd6c (diff)
downloadrockbox-6499ce3e445e1acc5f5707fd164ad5e3c5ab0a43.tar.gz
rockbox-6499ce3e445e1acc5f5707fd164ad5e3c5ab0a43.zip
android: Get the port up and running again
The build system needed fixes because the tools paths changed and one tool that we used (apkbuilder) was removed entirely. Recent NDKs don't ship gcc 4.4.3 anymore, therefore switch to 4.6. The code itself needed a fix for a jni reference bug that was uncovered by KitKat. The port now builds with latest sdk (r22) and ndk (r9d). Change-Id: Id74fa54ba93bbb0ee30373fbe79e92c5ff03201d
-rw-r--r--android/.classpath1
-rw-r--r--android/android.make12
-rwxr-xr-xandroid/buildapk.sh19
-rw-r--r--android/project.properties2
-rw-r--r--android/src/org/rockbox/RockboxFramebuffer.java10
-rw-r--r--firmware/target/hosted/android/lcd-android.c64
-rwxr-xr-xtools/configure6
7 files changed, 61 insertions, 53 deletions
diff --git a/android/.classpath b/android/.classpath
index 0ca188f976..dec02b33c6 100644
--- a/android/.classpath
+++ b/android/.classpath
@@ -4,5 +4,6 @@
4 <classpathentry kind="src" path="src"/> 4 <classpathentry kind="src" path="src"/>
5 <classpathentry kind="src" path="gen"/> 5 <classpathentry kind="src" path="gen"/>
6 <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> 6 <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
7 <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
7 <classpathentry kind="output" path="bin/classes"/> 8 <classpathentry kind="output" path="bin/classes"/>
8</classpath> 9</classpath>
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
28.PHONY: apk classes clean dex dirs libs jar 28.PHONY: apk classes clean dex dirs libs jar
29 29
30# API version 30# API version
31ANDROID_PLATFORM_VERSION=16 31ANDROID_PLATFORM_VERSION=19
32ANDROID_PLATFORM=$(ANDROID_SDK_PATH)/platforms/android-$(ANDROID_PLATFORM_VERSION) 32ANDROID_PLATFORM=$(ANDROID_SDK_PATH)/platforms/android-$(ANDROID_PLATFORM_VERSION)
33 33
34# android tools 34# android tools
35AAPT=$(ANDROID_SDK_PATH)/platform-tools/aapt 35BUILD_TOOLS_VERSION=19.0.3
36DX=$(ANDROID_SDK_PATH)/platform-tools/dx 36AAPT=$(ANDROID_SDK_PATH)/build-tools/$(BUILD_TOOLS_VERSION)/aapt
37APKBUILDER=$(ANDROID_SDK_PATH)/tools/apkbuilder 37DX=$(ANDROID_SDK_PATH)/build-tools/$(BUILD_TOOLS_VERSION)/dx
38ZIPALIGN=$(ANDROID_SDK_PATH)/tools/zipalign 38ZIPALIGN=$(ANDROID_SDK_PATH)/tools/zipalign
39KEYSTORE=$(HOME)/.android/debug.keystore 39KEYSTORE=$(HOME)/.android/debug.keystore
40ADB=$(ANDROID_SDK_PATH)/platform-tools/adb 40ADB=$(ANDROID_SDK_PATH)/platform-tools/adb
41BUILDAPK=$(ANDROID_DIR)/buildapk.sh
41 42
42CLASSPATH := $(BUILDDIR)/bin/classes 43CLASSPATH := $(BUILDDIR)/bin/classes
43 44
@@ -130,8 +131,7 @@ $(BINLIB_DIR)/lib%.so: $(RBCODEC_BLD)/codecs/%.codec
130libs: $(DIRS) $(LIBS) 131libs: $(DIRS) $(LIBS)
131 132
132$(TEMP_APK): $(AP_) $(LIBS) $(DEX) | $(DIRS) 133$(TEMP_APK): $(AP_) $(LIBS) $(DEX) | $(DIRS)
133 $(call PRINTS,APK $(subst $(BUILDDIR)/,,$@))$(APKBUILDER) $@ \ 134 $(call PRINTS,APK $(subst $(BUILDDIR)/,,$@))$(BUILDAPK) $(BUILDDIR) $(notdir $@) $(BUILD_TOOLS_VERSION)
134 -u -z $(AP_) -f $(DEX) -nf $(BUILDDIR)/libs
135 135
136$(KEYSTORE): 136$(KEYSTORE):
137 $(SILENT)mkdir -p $(HOME)/.android 137 $(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 @@
1#!/bin/sh
2
3BUILDDIR=$1
4APK=$2
5SDKV=$3
6
7[ -z $ANDROID_SDK_PATH ] && exit 1
8[ -z $BUILDDIR ] && exit 1
9[ -d $BUILDDIR ] || exit 1
10
11# need to cd into the bin dir and create a symlink to the libraries
12# so that aapt puts the libraries with the correct prefix into the apk
13cd $BUILDDIR/bin
14ln -nfs $BUILDDIR/libs lib
15cp resources.ap_ $APK
16$ANDROID_SDK_PATH/build-tools/$SDKV/aapt add $APK classes.dex > /dev/null
17$ANDROID_SDK_PATH/build-tools/$SDKV/aapt add $APK lib/*/* > /dev/null
18
19exit 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 @@
8# project structure. 8# project structure.
9 9
10# Project target. 10# Project target.
11target=android-16 11target=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
57 setEnabled(false); 57 setEnabled(false);
58 } 58 }
59 59
60 /* second stage init; called from Rockbox with information about the
61 * display framebuffer */
62 private void initialize(int lcd_width, int lcd_height)
63 {
64 btm = Bitmap.createBitmap(lcd_width, lcd_height, Bitmap.Config.RGB_565);
65 setEnabled(true);
66 }
67
68 private void update(ByteBuffer framebuffer) 60 private void update(ByteBuffer framebuffer)
69 { 61 {
70 SurfaceHolder holder = getHolder(); 62 SurfaceHolder holder = getHolder();
@@ -138,5 +130,7 @@ public class RockboxFramebuffer extends SurfaceView
138 public native void surfaceDestroyed(SurfaceHolder holder); 130 public native void surfaceDestroyed(SurfaceHolder holder);
139 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 131 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
140 { 132 {
133 btm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
134 setEnabled(true);
141 } 135 }
142} 136}
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;
34static jobject RockboxFramebuffer_instance; 34static jobject RockboxFramebuffer_instance;
35static jmethodID java_lcd_update; 35static jmethodID java_lcd_update;
36static jmethodID java_lcd_update_rect; 36static jmethodID java_lcd_update_rect;
37static jmethodID java_lcd_init;
38 37
39static jclass AndroidRect_class; 38static jclass AndroidRect_class;
40static jmethodID AndroidRect_constructor; 39static jmethodID AndroidRect_constructor;
@@ -42,6 +41,7 @@ static jmethodID AndroidRect_constructor;
42static int dpi; 41static int dpi;
43static int scroll_threshold; 42static int scroll_threshold;
44static bool display_on; 43static bool display_on;
44static bool connected;
45 45
46/* this might actually be called before lcd_init_device() or even main(), so 46/* this might actually be called before lcd_init_device() or even main(), so
47 * be sure to only access static storage initalized at library loading, 47 * be sure to only access static storage initalized at library loading,
@@ -49,38 +49,26 @@ static bool display_on;
49static void connect_with_java(JNIEnv* env, jobject fb_instance) 49static void connect_with_java(JNIEnv* env, jobject fb_instance)
50{ 50{
51 JNIEnv e = *env; 51 JNIEnv e = *env;
52 static bool have_class;
53 52
54 if (!have_class) 53 jclass fb_class = e->GetObjectClass(env, fb_instance);
55 { 54 /* cache update functions */
56 jclass fb_class = e->GetObjectClass(env, fb_instance); 55 java_lcd_update = e->GetMethodID(env, fb_class,
57 /* cache update functions */ 56 "update",
58 java_lcd_update = e->GetMethodID(env, fb_class, 57 "(Ljava/nio/ByteBuffer;)V");
59 "update", 58 java_lcd_update_rect = e->GetMethodID(env, fb_class,
60 "(Ljava/nio/ByteBuffer;)V"); 59 "update",
61 java_lcd_update_rect = e->GetMethodID(env, fb_class, 60 "(Ljava/nio/ByteBuffer;"
62 "update", 61 "Landroid/graphics/Rect;)V");
63 "(Ljava/nio/ByteBuffer;" 62 jmethodID get_dpi = e->GetMethodID(env, fb_class,
64 "Landroid/graphics/Rect;)V"); 63 "getDpi", "()I");
65 jmethodID get_dpi = e->GetMethodID(env, fb_class, 64 jmethodID thresh = e->GetMethodID(env, fb_class,
66 "getDpi", "()I"); 65 "getScrollThreshold", "()I");
67 jmethodID thresh = e->GetMethodID(env, fb_class, 66 /* these don't change with new instances so call them now */
68 "getScrollThreshold", "()I"); 67 dpi = e->CallIntMethod(env, fb_instance, get_dpi);
69 /* these don't change with new instances so call them now */ 68 scroll_threshold = e->CallIntMethod(env, fb_instance, thresh);
70 dpi = e->CallIntMethod(env, fb_instance, get_dpi); 69
71 scroll_threshold = e->CallIntMethod(env, fb_instance, thresh); 70 AndroidRect_constructor = e->GetMethodID(env, AndroidRect_class,
72 71 "<init>", "(IIII)V");
73 java_lcd_init = e->GetMethodID(env, fb_class,
74 "initialize", "(II)V");
75 AndroidRect_class = e->FindClass(env, "android/graphics/Rect");
76 AndroidRect_constructor = e->GetMethodID(env, AndroidRect_class,
77 "<init>", "(IIII)V");
78 have_class = true;
79 }
80
81 /* we need to setup parts for the java object every time */
82 (*env)->CallVoidMethod(env, fb_instance, java_lcd_init,
83 (jint)LCD_WIDTH, (jint)LCD_HEIGHT);
84} 72}
85 73
86/* 74/*
@@ -132,12 +120,18 @@ Java_org_rockbox_RockboxFramebuffer_surfaceCreated(JNIEnv *env, jobject this,
132 jobject surfaceholder) 120 jobject surfaceholder)
133{ 121{
134 (void)surfaceholder; 122 (void)surfaceholder;
123 jclass rect;
135 124
136 /* Update RockboxFramebuffer_instance */ 125 /* Update RockboxFramebuffer_instance */
137 RockboxFramebuffer_instance = (*env)->NewGlobalRef(env, this); 126 RockboxFramebuffer_instance = (*env)->NewGlobalRef(env, this);
138 127 rect = (*env)->FindClass(env, "android/graphics/Rect");
128 AndroidRect_class = (*env)->NewGlobalRef(env, rect);
139 /* possibly a new instance - reconnect */ 129 /* possibly a new instance - reconnect */
140 connect_with_java(env, this); 130 if (!connected)
131 {
132 connect_with_java(env, this);
133 connected = true;
134 }
141 display_on = true; 135 display_on = true;
142 136
143 /* need to wait for button_queue to be valid to post to */ 137 /* 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,
163 157
164 (*e)->DeleteGlobalRef(e, RockboxFramebuffer_instance); 158 (*e)->DeleteGlobalRef(e, RockboxFramebuffer_instance);
165 RockboxFramebuffer_instance = NULL; 159 RockboxFramebuffer_instance = NULL;
160 (*e)->DeleteGlobalRef(e, AndroidRect_class);
161 AndroidRect_class = NULL;
166} 162}
167 163
168bool lcd_active(void) 164bool 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 () {
673 LDOPTS="$LDOPTS -Wl,-soname,librockbox.so -shared -ldl -llog" 673 LDOPTS="$LDOPTS -Wl,-soname,librockbox.so -shared -ldl -llog"
674 GLOBAL_LDOPTS="-Wl,-z,defs -Wl,-z,noexecstack -shared" 674 GLOBAL_LDOPTS="-Wl,-z,defs -Wl,-z,noexecstack -shared"
675 ANDROID_ARCH=$1 # for android.make too 675 ANDROID_ARCH=$1 # for android.make too
676 gccchoice="4.6"
676 # arch dependant stuff 677 # arch dependant stuff
677 case $ANDROID_ARCH in 678 case $ANDROID_ARCH in
678 armeabi) 679 armeabi)
679 endian="little" 680 endian="little"
680 gccchoice="4.4.3"
681 gcctarget="arm-linux-androideabi-" 681 gcctarget="arm-linux-androideabi-"
682 # sigaltstack is not available in pre-android-9, however asm 682 # sigaltstack is not available in pre-android-9, however asm
683 # threads work fine so far 683 # threads work fine so far
@@ -688,7 +688,6 @@ androidcc () {
688 ;; 688 ;;
689 mips) 689 mips)
690 endian="little" 690 endian="little"
691 gccchoice="4.4.3"
692 gcctarget="mipsel-linux-android-" 691 gcctarget="mipsel-linux-android-"
693 thread_support="HAVE_SIGALTSTACK_THREADS" 692 thread_support="HAVE_SIGALTSTACK_THREADS"
694 GCCOPTS="$GCCOPTS -march=mips32 -mtune=r4600 -mno-mips16 -mno-long-calls -fomit-frame-pointer \ 693 GCCOPTS="$GCCOPTS -march=mips32 -mtune=r4600 -mno-mips16 -mno-long-calls -fomit-frame-pointer \
@@ -696,8 +695,7 @@ androidcc () {
696 LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-14/arch-mips" 695 LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-14/arch-mips"
697 ;; 696 ;;
698 x86) 697 x86)
699 endian=little 698 endian="little"
700 gccchoice="4.4.3"
701 gcctarget="i686-linux-android-" 699 gcctarget="i686-linux-android-"
702 gccdir=x86-$gccchoice 700 gccdir=x86-$gccchoice
703 thread_support="HAVE_SIGALTSTACK_THREADS" 701 thread_support="HAVE_SIGALTSTACK_THREADS"