User Tools

Site Tools


android:android-jni:ndkbuild-shell-for-linux

This is an old revision of the document!


NDK Shell for Linux

自己简单封装了一下ndk-build

支持:

  1. 通过修改build-static-library.mk,可以生成静态库
  2. 直接解析Android.mk,支持设置安装目录,支持自动拷贝依赖的静态库

使用方法

  1. 和以前一样,只是直接调用脚本名字ndk。
  2. 支持原来ndk-build参数,如:ndk clean,ndk -h等。

#!/bin/sh
 
#Your Android.mk Maybe need to add INSTALL_DIR and MY_STATIC_LIBRARIES.
#Now it just support parse these variables:
#   INSTALL_DIR =>Where you want to install the static library.
#   MY_STATIC_LIBRARIES =>Some dependent static libraries,with the full path or relative path.
#NOTICE:
#1.This shell just support parse MY_STATIC_LIBRARIES like this:
#	MY_STATIC_LIBRARIES = ../libafc.a
#	MY_STATIC_LIBRARIES = ../libutf8.a
#2.If you need to run this shell,you must cd to the RIGHT directory
#You MUST see ./jni/Android.mk,then this shell will run,otherwise it will exit.
 
#Author:pengjianqing@gmail.com
#Date:20101126
 
START_AT=`date`
 
#Parsed list in Android.mk
INSTALL_DIR="INSTALL_DIR"
MY_STATIC_LIBRARIES="MY_STATIC_LIBRARIES" 
 
ANDROID_MK="jni/Android.mk"
 
CREATED_LIBRARIES_DIR="libs/armeabi"
 
#help()
#{
#    cat <<HELP
#    ndk-build -h
#
#HELP
#    exit 0
#}
 
printTime(){
    echo "Start at ${START_AT}"
    echo "Finish at `date`"
}
 
prepareStaticLibraries(){
    echo "##################################################"
    echo "Prepare the static libraries"
    #LOCAL_STATIC_LIBRARIES=`grep LOCAL_STATIC_LIBRARIES ${ANDROID_MK}|grep -v ^#|cut -d "=" -f2|tail -n 1`
    #echo LOCAL_STATIC_LIBRARIES=$LOCAL_STATIC_LIBRARIES
 
    BIN_ARMEABI="obj/local/armeabi/"
    mkdir -p ${BIN_ARMEABI}
    STATIC_LIBRARIES=`grep ${MY_STATIC_LIBRARIES} ${ANDROID_MK}|grep -v ^#|cut -d "=" -f2|sed 's/ //g'`
    for i in ${STATIC_LIBRARIES}
do 
    #echo STATIC_LIBRARIES=$i
    cd jni
    echo "cp ${i}  ../${BIN_ARMEABI}"
    cp ${i}  ../${BIN_ARMEABI}
    cd ..
done
echo "##################################################"
}
 
installLibraries(){
    echo "##################################################"
    echo "Install the Built Libraries."
    FILE_A=`grep LOCAL_MODULE ${ANDROID_MK} |grep -v ^#|cut -d "=" -f2|tail -n 1|sed 's/ //g'|sed 's/^/lib/g'|sed 's/$/.a/g'` 
    FILE_SO=`grep LOCAL_MODULE ${ANDROID_MK} |grep -v ^#|cut -d "=" -f2|tail -n 1|sed 's/ //g'|sed 's/^/lib/g'|sed 's/$/.so/g'` 
 
    #echo FILE=${FILE}
 
    DIR=`grep ${INSTALL_DIR} ${ANDROID_MK}|grep -v ^#|cut -d "=" -f2|tail -n 1|sed 's/ //g'`
    #echo DIR=${DIR}
 
    if ! [ -n ${DIR} ] || [ "${DIR}" = "" ] ;then
	#echo "return"
	echo "Do not set INSTALL_DIR in the Android.mk,so just exit."
	echo "##################################################"
	return
    fi
 
    if [ -f "${CREATED_LIBRARIES_DIR}/${FILE_A}" ];then
	echo "${FILE_A} exist,copy it to ${DIR}"
	echo "cd jni"
	cd jni
	echo "cp ../${CREATED_LIBRARIES_DIR}/${FILE_A} ${DIR}"
	cp ../${CREATED_LIBRARIES_DIR}/${FILE_A} ${DIR}
	cd ..
    elif [ -f "${CREATED_LIBRARIES_DIR}/${FILE_SO}" ];then
	echo "${FILE_SO} exist,copy it to ${DIR}"
	echo "cd jni"
	cd jni
	echo "cp ../${CREATED_LIBRARIES_DIR}/${FILE_SO} ${DIR}"
	cp ../${CREATED_LIBRARIES_DIR}/${FILE_SO} ${DIR}
	cd ..
    else
	echo "${FILE_A} or ${FILE_SO} doesn't exist,MAYBE BUILD FAILED!"
    fi
    echo "##################################################"
}
 
clean(){
    if [ "$1" = "clean" ];then
	echo "ndk-build clean"
	ndk-build clean
	#echo "rm bin libs obj -rf"
	rm bin libs obj -rf
	exit 0
    fi
}
 
 
check_env(){
    echo "##################################################"
    echo "Start to check the environment..."
    NDK_BUILD=`which ndk-build`
    echo NDK_BUILD=${NDK_BUILD}
    if [ "${NDK_BUILD}" = "" ];then
	echo "Can't find ndk-build,Have you added the ndk-build path to PATH?"
	echo "Please run \"which ndk-build\" to check the it"
	exit 0
    else
	echo "Find ndk-build successfully,continue..."
    fi
    if [ ! -f ${ANDROID_MK} ];then
	echo "./${ANDROID_MK} doesn't exist,Please check the project directory."
	exit 0
    fi
 
 
    #Append "include $(BUILD_SYSTEM)/install-binary.mk" to build-static-library.mk
    #Add this to support build static library.
    TO_BE_APPEND="include \$(BUILD_SYSTEM)/install-binary.mk"
    build_static_library_mk="`dirname ${NDK_BUILD}`/build/core/build-static-library.mk"
    #echo build_static_library_mk=$build_static_library_mk
 
    if [ ! -f ${build_static_library_mk} ];then
	echo "Can't find build-static-library.mk,maybe can't create the static library."
    else
	TMP=`grep "${TO_BE_APPEND}" ${build_static_library_mk}|grep -v ^#`
 
	if [ "${TMP}" = "" ];then
	    echo "echo ${TO_BE_APPEND} >>${build_static_library_mk}"
	    echo ${TO_BE_APPEND} >>${build_static_library_mk}
	fi
    fi
    echo "Check the environment...SUCCESS"
}
 
 
#if it is ndk-build -h,just print the help and exit.
echo ${1}
#A=`grep "^-" "${1}"`
if [ "${1}" = "-h" ];then
    ndk-build ${1}
    exit 0
fi
 
#Check the environment.
check_env
 
#check whether it is ndk-build clean,and exit.
clean $1
 
 
#Prepare the Needed StaticLibraries if need.
prepareStaticLibraries
 
n="${#}"
#echo parameters number = ${n}
 
case $# in
    0) ndk-build;;
    1) ndk-build ${1};;
    2) ndk-build ${1} ${2};;
    3) ndk-build ${1} ${2} ${3};;
    *) break;;
esac
 
#Install the built library.
installLibraries
 
#Print the start time and finish time.
printTime

/var/www/dokuwiki/wiki/data/attic/android/android-jni/ndkbuild-shell-for-linux.1291110013.txt.gz · Last modified: 2016/05/05 13:06 (external edit)