Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add compile android arm native lib #188

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion Makefile
Expand Up @@ -88,7 +88,7 @@ NATIVE_TARGET_DIR:=$(TARGET)/classes/org/sqlite/native/$(OS_NAME)/$(OS_ARCH)
NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME)

# For cross-compilation, install docker. See also https://github.com/dockcross/dockcross
native-all: native win32 win64 linux32 linux64 linux-arm linux-armhf
native-all: native win32 win64 linux32 linux64 linux-arm linux-armhf android-arm

native: $(SQLITE_UNPACKED) $(NATIVE_DLL)

Expand All @@ -98,6 +98,9 @@ $(NATIVE_DLL): $(SQLITE_OUT)/$(LIBNAME)
@mkdir -p $(NATIVE_TARGET_DIR)
cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME)

android-arm: $(SQLITE_UNPACKED) jni-header
./docker/dockcross-android bash -c 'make clean-native native CROSS_PREFIX=/usr/arm-linux-androideabi/bin/arm-linux-androideabi- OS_NAME=Android OS_ARCH=arm'
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A concern here is OS_NAME (Android) should match JVM system property os.name of DalvikVM for Android.


win32: $(SQLITE_UNPACKED) jni-header
./docker/dockcross-windows-x86 bash -c 'make clean-native native CROSS_PREFIX=i686-w64-mingw32.static- OS_NAME=Windows OS_ARCH=x86'

Expand Down
7 changes: 7 additions & 0 deletions Makefile.common
Expand Up @@ -64,6 +64,13 @@ Default_LINKFLAGS := -shared
Default_LIBNAME := libsqlitejdbc.so
Default_SQLITE_FLAGS :=

Android-arm_CC := $(CROSS_PREFIX)gcc
Android-arm_STRIP := $(CROSS_PREFIX)strip
Android-arm_CCFLAGS := -Ilib/inc_linux -I/usr/arm-linux-androideabi/sysroot/usr/include -I$(JAVA_HOME)/include -I/usr/arm-linux-androideabi/sysroot/usr/lib -O2 -fPIC -fvisibility=hidden -fPIE -pie -lm -lc -landroid -ldl -llog
Android-arm_LINKFLAGS := -static-libgcc -shared
Android-arm_LIBNAME := libsqlitejdbc.so
Android-arm_SQLITE_FLAGS :=

Linux-x86_CC := $(CROSS_PREFIX)gcc
Linux-x86_STRIP := $(CROSS_PREFIX)strip
Linux-x86_CCFLAGS := -I$(JAVA_HOME)/include -Ilib/inc_linux -O2 -fPIC -m32 -fvisibility=hidden
Expand Down
200 changes: 200 additions & 0 deletions docker/dockcross-android
@@ -0,0 +1,200 @@
#!/bin/bash

DEFAULT_DOCKCROSS_IMAGE=dockcross/android-arm

#------------------------------------------------------------------------------
# Helpers
#
err() {
echo -e >&2 ERROR: $@\\n
}

die() {
err $@
exit 1
}

has() {
# eg. has command update
local kind=$1
local name=$2

type -t $kind:$name | grep -q function
}

#------------------------------------------------------------------------------
# Command handlers
#
command:update-image() {
docker pull $FINAL_IMAGE
}

help:update-image() {
echo Pull the latest $FINAL_IMAGE .
}

command:update-script() {
if cmp -s <( docker run $FINAL_IMAGE ) $0; then
echo $0 is up to date
else
echo -n Updating $0 '... '
docker run $FINAL_IMAGE > $0 && echo ok
fi
}

help:update-image() {
echo Update $0 from $FINAL_IMAGE .
}

command:update() {
command:update-image
command:update-script
}

help:update() {
echo Pull the latest $FINAL_IMAGE, and then update $0 from that.
}

command:help() {
if [[ $# != 0 ]]; then
if ! has command $1; then
err \"$1\" is not an dockcross command
command:help
elif ! has help $1; then
err No help found for \"$1\"
else
help:$1
fi
else
cat >&2 <<ENDHELP
Usage: dockcross [options] [--] command [args]

By default, run the given *command* in an dockcross Docker container.

The *options* can be one of:

--args|-a Extra args to the *docker run* command
--image|-i Docker cross-compiler image to use
--config|-c Bash script to source before running this script


Additionally, there are special update commands:

update-image
update-script
update

For update command help use: $0 help <command>
ENDHELP
exit 1
fi
}

#------------------------------------------------------------------------------
# Option processing
#
special_update_command=''
while [[ $# != 0 ]]; do
case $1 in

--)
break
;;

--args|-a)
ARG_ARGS="$2"
shift 2
;;

--config|-c)
ARG_CONFIG="$2"
shift 2
;;

--image|-i)
ARG_IMAGE="$2"
shift 2
;;
update|update-image|update-script)
special_update_command=$1
break
;;
-*)
err Unknown option \"$1\"
command:help
exit
;;

*)
break
;;

esac
done

# The precedence for options is:
# 1. command-line arguments
# 2. environment variables
# 3. defaults

# Source the config file if it exists
DEFAULT_DOCKCROSS_CONFIG=~/.dockcross
FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}}

[[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG"

# Set the docker image
FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}}

# Handle special update command
if [ "$special_update_command" != "" ]; then
case $special_update_command in

update)
command:update
exit $?
;;

update-image)
command:update-image
exit $?
;;

update-script)
command:update-script
exit $?
;;

esac
fi

# Set the docker run extra args (if any)
FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}}

# If we are not running via boot2docker
if [ -z $DOCKER_HOST ]; then
USER_IDS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )"
fi

#------------------------------------------------------------------------------
# Now, finally, run the command in a container
#
docker run --rm \
-v $PWD:/work \
$USER_IDS \
$FINAL_ARGS \
$FINAL_IMAGE "$@"

################################################################################
#
# This image is not intended to be run manually.
#
# To create a dockcross helper script for the
# dockcross/linux-armv7 image, run:
#
# docker run --rm dockcross/linux-armv7 > dockcross-linux-armv7
# chmod +x dockcross-linux-armv7
#
# You may then wish to move the dockcross script to your PATH.
#
################################################################################
5 changes: 4 additions & 1 deletion src/main/java/org/sqlite/util/OSInfo.java
Expand Up @@ -162,6 +162,9 @@ else if (osName.contains("Linux")) {
else if (osName.contains("AIX")) {
return "AIX";
}
else if (osName.contains("Android")) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@psini Did you check the actual value of os.name JVM property under Android?
I think it's just Linux, so this code wouldn't work as expected

return "Android";
}

else {
return osName.replaceAll("\\W", "");
Expand All @@ -171,4 +174,4 @@ else if (osName.contains("AIX")) {
static String translateArchNameToFolderName(String archName) {
return archName.replaceAll("\\W", "");
}
}
}