【android】Android平台通用编译环境

Date: 2018.9.30

1、Android NDK下载:(内含ndk-build)

https://developer.android.google.cn/ndk/downloads/
http://www.voidcn.com/article/p-fjfskgpc-bph.html
https://developer.android.google.cn/ndk/guides/stable_apis#purpose

2、Android平台通用编译环境
2.1、Linux下编译Android程序(shell脚本)
#!/bin/bash
if [ $# -ne 1]; then
	echo "./build.sh ndk_dir"
	exit
fi

# get current dir
PJTDIR=$(pwd)

#check if we are in the ndk directory
cd $1
if [ ! -f "ndk-build"]; then
	echo "Run this script under NDK directory\n"
	exit
fi
echo "------------------------clear output dir-------------------------"
find $PJTDIR/obj -name "*.[od]" | xargs rm -rf
find $PJTDIR/obj -name "*.so" | xargs rm -rf
find $PJTDIR/libs -name  "*.so" | xargs rm -rf
find $PJTDIR/out -name "*.so" | xargs rm -rf

find $PJTDIR/obj -name "*.[od]" | xargs rm -rf
find $PJTDIR/obj -name "*.a" | xargs rm -rf
find $PJTDIR/libs -name  "*.a" | xargs rm -rf
find $PJTDIR/out -name "*.a" | xargs rm -rf
echo "------------------------build static library----------------------"
#cp $PJRDOR/jni/Android_lib.mk $PJRLIB/jni/Android.mk
./ndk-build -B -C $PJTDIR APP_BUILD_SCRIPT:=Android_lib.mk
cp  $PJTDIR/obj/local/armeabi/libxxx.a  $PJTDIR/out/armeabi/
cp  $PJTDIR/obj/local/armeabi-v7a/libxxx.a  $PJTDIR/out/armeabi-v7a/
cp  $PJTDIR/obj/local/arm64-v8a/libxxx.a  $PJTDIR/out/arm64-v8a/
cp  $PJTDIR/obj/local/x86/libxxx.a  $PJTDIR/out/x86/
cp  $PJTDIR/obj/local/x86_64/libxxx.a  $PJTDIR/out/x86_64/
cp  $PJTDIR/obj/local/mips/libxxx.a  $PJTDIR/out/mips/
cp  $PJTDIR/obj/local/mips64/libxxx.a  $PJTDIR/out/mips64/

echo "------------------------build dynamic library----------------------"
#cp $PJRDOR/jni/Android_lib.mk $PJRLIB/jni/Android.mk
./ndk-build -B -C $PJTDIR APP_BUILD_SCRIPT:=Android_lib.mk
cp  $PJTDIR/obj/local/armeabi/libxxx.so $PJTDIR/out/armeabi/
cp  $PJTDIR/obj/local/armeabi-v7a/libxxx.so  $PJTDIR/out/armeabi-v7a/
cp  $PJTDIR/obj/local/arm64-v8a/libxxx.so  $PJTDIR/out/arm64-v8a/
cp  $PJTDIR/obj/local/x86/libxxx.so  $PJTDIR/out/x86/
cp  $PJTDIR/obj/local/x86_64/libxxx.so  $PJTDIR/out/x86_64/
cp  $PJTDIR/obj/local/mips/libxxx.so  $PJTDIR/out/mips/
cp  $PJTDIR/obj/local/mips64/libxxx.so  $PJTDIR/out/mips64/

echo "------------------------build dynamic executable----------------------" 
#cp $PJRDOR/jni/Android_app.mk  $PJRLIB/jni/Android.mk
./ndk-build -B -C $PJTDIR APP_BUILD_SCRIPT:=Android_app.mk
cp  $PJTDIR/obj/local/armeabi/xxx $PJTDIR/out/armeabi/
cp  $PJTDIR/obj/local/armeabi-v7a/xxx  $PJTDIR/out/armeabi-v7a/
cp  $PJTDIR/obj/local/arm64-v8a/xxx  $PJTDIR/out/arm64-v8a/
cp  $PJTDIR/obj/local/x86/xxx  $PJTDIR/out/x86/
cp  $PJTDIR/obj/local/x86_64/xxx  $PJTDIR/out/x86_64/
cp  $PJTDIR/obj/local/mips/xxx  $PJTDIR/out/mips/
cp  $PJTDIR/obj/local/mips64/xxx  $PJTDIR/out/mips64/

echo "------------------------build static executable----------------------" 
#cp $PJRDOR/jni/Android_app_static.mk  $PJRLIB/jni/Android.mk
./ndk-build -B -C $PJTDIR APP_BUILD_SCRIPT:=Android_app_static.mk
cp  $PJTDIR/obj/local/armeabi/xxx $PJTDIR/out/armeabi/
cp  $PJTDIR/obj/local/armeabi-v7a/xxx  $PJTDIR/out/armeabi-v7a/
cp  $PJTDIR/obj/local/arm64-v8a/xxx  $PJTDIR/out/arm64-v8a/
cp  $PJTDIR/obj/local/x86/xxx  $PJTDIR/out/x86/
cp  $PJTDIR/obj/local/x86_64/xxx  $PJTDIR/out/x86_64/
cp  $PJTDIR/obj/local/mips/xxx  $PJTDIR/out/mips/
cp  $PJTDIR/obj/local/mips64/xxx  $PJTDIR/out/mips64/

echo "------------------------tar---------------------" 
tar -zcvf $PJTDIR/out/libxxx_android_armeabi.tar.gz  -C $PJTDIR/out/armeabi/
tar -zcvf $PJTDIR/out/libxxx_android_armeabi-v7a.tar.gz  -C $PJTDIR/out/armeabi-v7a/
tar -zcvf $PJTDIR/out/libxxx_android_arm64-v8a.tar.gz  -C $PJTDIR/out/arm64-v8a/
tar -zcvf $PJTDIR/out/libxxx_android_x86.tar.gz  -C $PJTDIR/out/x86/
tar -zcvf $PJTDIR/out/libxxx_android_x86_64.tar.gz  -C $PJTDIR/out/x86_64/
tar -zcvf $PJTDIR/out/libxxx_android_mips.tar.gz  -C $PJTDIR/out/mips/
tar -zcvf $PJTDIR/out/libxxx_android_mips64.tar.gz  -C $PJTDIR/out/mips64/
echo "------------------------check results---------------------" 
ls -l $PJTDIR/out
ls -l $PJTDIR/armeabi
ls -l $PJTDIR/armeabi-v7a
ls -l $PJTDIR/arm64-v8a
ls -l $PJTDIR/x86
ls -l $PJTDIR/x86-64
ls -l $PJTDIR/mips
ls -l $PJTDIR/mips-64

其中:核心命令为:
./ndk-build -B -C $PJTDIR APP_BUILD_SCRIPT:=Android_lib.mk
其中,-B表示强制rebuild,-C表示Android.mk和Application.mk两个文件夹所在路径,就是指定makefile的路径,与linux中make -C dir是同一个含义,APP_BUILD_SCRIPT用于指定编译的makefile,同linux中的make -f makefile,NDK_PROJECT_PATH用于指定makefile的路径。

注意:
1、无论是编译动态库、静态库还是可执行文件,都需要各自对应的Android.mk和Application.mk这两个文件。
2、Application.mk通常用于指定需要编译的平台的个数,比如
APP_ABI := x86 x86_64 armeabi armeabi-v7a arm64-v8a
APP_PLATFORM := android-9
NDK_TOOLCHAIN_VERSION := 4.9
3、Android.mk相当于被Applicatioin.mk调用的,即每个平台都会调用一次Android.mk产生一个相应平台的编译出来的模块。

不同 CPU 和架构的 ABI 设置如下表所示:

CPU 和架构设置
ARMv5TEarmeabi
ARMv7armeabi-v7a
ARMv8 AArch64arm64-v8a
i686x86
x86-64x86_64
mips32 (r1)mips
mips64 (r6)mips64
全部all
2.2、Window下编译Android程序(Python脚本)

在没有shell环境情况下,采用windows环境下的python脚本:

//cmd="ndk-build -B -C ./ NDK_PROJECT_PATH=./ APP_BUILD_SCRIPT=./Android.mk"
#coding=utf8
import os
import sys
import glob
import shutil
import platform
from sys import argv

share_lib_name = 'libxxx.so'
static_lib_name =  'libxxx.a'
static_exe = 'demo'
#检查是否为windows系统
def  isWindowsSys():
	return 'Windows' in platform.system()
#检查是否为Linux系统
def  isLinuxSys():
	return 'Linux' in platform.system()
#清空目录下的内容
def delDirFile(path):
	def i in os.listdir(path):
		file_path = os.path.join(path, i)
		if os.path.isfile(file_path):
			os.remove(file_path)
		else
			delDirFile(file_path)
			
def process(ndk_dir, android_dir, pure_c, delimiter):
	ndk_build = ndk_dir + delimiter + 'ndk-build'
	app_mk = android_dir + delimiter + 'jni' + delimiter + 'Application.mk'
	mk_dir = android_dir + delimiter + 'jni'
	static_lib_dir = android_dir + delimiter + 'obj' + delimiter + 'local' + delimiter
	out_sha_lib = android_dir + delimiter + 'out' + delimiter
	share_lib_dir = android_dir + delimiter + 'obj' + delimiter + 'local' + delimiter
	out_sta_lib = android_dir + delimiter + 'out' + delimiter
	if isWindowsSys():
		cpy = "copy "
	else:
		cpy = "cp "
# "=================CLEAR OUTPUT DIR========================="
outdir_files = glob.glob(android_dir + delimiter + 'out' + delimiter + '*')
for outdir in outdir_files:
	print(outdir)
	delDelFile(outdir)
	isExist = os.path.exists(ourdir)
	if(not isExist):
		os.mkdir(outdir)

pFile = open(app_mk, 'w')
cmd = 'APP_ABI := x86 x86_64 armeabi armeabi-v7a arm64-v8a \nAPP_PLATFORM := android-9\nNDK_TOOLCHAIN_VERSION := 4.9'
pFile.writeLines(cmd)
pFile.write('\n')
pFile.close()
# "==================BUILD SHARED LIBRARY===================="
cmd = ndk_build + " -B " + "NDK_PROJECT_PATH:=" + android_dir + "APP_BUILD_SCRIPT:=" + mk_dir + delimiter + "Android_lib.mk" + " V=1 SHARED=0"
print(cmd)
os.system(cmd)
cmd = cpy + share_lib_dir + "x86" + delimiter + share_lib_name + "  " + out_sha_lib + "x86" + delimiter 
print(cmd)
os.system(cmd)
##其他平台依次类推
# "==================BUILD STATIC LIBRARY===================="
cmd = ndk_build + " -B " + "NDK_PROJECT_PATH:=" + android_dir + "APP_BUILD_SCRIPT:=" + mk_dir + delimiter + "Android_lib.mk"
print(cmd)
os.system(cmd)
cmd = cpy + static_lib_dir + "x86" + delimiter + static_lib_name + "  " + out_sta_lib + "x86" + delimiter 
print(cmd)
os.system(cmd)
##其他平台依次类推
# "==================BUILD STATIC EXE ===================="
cmd = ndk_build + " -B " + "NDK_PROJECT_PATH:=" + android_dir + "APP_BUILD_SCRIPT:=" + mk_dir + delimiter + "Android_app.mk"
print(cmd)
os.system(cmd)
cmd = cpy + static_lib_dir + "x86" + delimiter + static_lib_name + "  " + out_sta_lib + "x86" + delimiter 
print(cmd)
os.system(cmd)
##其他平台依次类推

##############################main函数入口######################
if __name__ == '__main__':
	if(len(argv) < 3):
		printf("Tips: build_android.py android_ndk_dir pure_c=0/1\n")
		exit()
	delimiter =os.path.sep
	ndk_dir = argv[1]
	pure_c = argv[2]
	android_dir = os.getcwd()
	process(ndkdir,android_dir,pure_c,delimiter)
	
3、Android平台真机测试方法

android真机测试方法

4、Android平台通用编译模板

Android平台通用编译模板

5、参考

关于Application.mk,Android.mk和JNI的介绍更多可参考:
https://developer.android.google.cn/ndk/guides/android_mk
https://developer.android.google.cn/ndk/guides/application_mk
https://developer.android.google.cn/ndk/guides/ndk-build
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
https://blog.csdn.net/yuanjize1996/article/details/54376228
https://blog.csdn.net/xyz_lmn/article/details/6966259/


THE END!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的鲲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值