进入到cygwin的/home/username目录,username是你当前登录机器的用户名,修改该目录下的.bash_profile,在文件的尾部加入如下代码,设置ndk安装的根目录。
NDK_ROOT=/cygdrive/d/workdoc_tool/android_env_build/windows/android-ndk-r6b
export NDK_ROOT
环境变量名NDK_ROOT为NDK安装包根目录,名字可以随便取,只是用于切换目录时方便而已。
2> cd到应用程序$Program, 在该目录下mkdir jni 目录。
3> cd $NDK_ROOT/build/core,将该目录下的default-application.mk 拷贝到需要编译的应用程序$Program下的jni目录下,并且重新命名为Application.mk。
4> 修改Application.mk中变量内容,指定需要编译的project路径,并且指定project path下对应的build 的make file脚本。这里我的工程为MyTest工程。
APP_ABI := x86
APP_PLATFORM := android-9
APP_MODULES := \
mytest ----对应Android.mk里的要编译的LOCAL_MODULE
我们的Android.mk就是用的Mytest/jni/下,所以这里APP_PROJECT_PATH和APP_BUILD_SCRIPT就没必要设置了。
5> ~/Mytest/jni/Android.mk 内容如下:
LOCAL_PATH := $(call my-dir)
TOP_PATH := $(call my-dir)
TEMP_PATH := $(call my-dir)
include $(TEMP_PATH)/mytest.mk
6> ~/Mytest/jni/mytest.mk 内容如下(依赖静态库,动态库):
LOCAL_PATH := $(call my-dir)/../
#static library
include $(CLEAR_VARS)
LOCAL_MODULE := Link
LOCAL_SRC_FILES := ./lib/libLink.a -----这里不能写成$(LOCAL_PATH)/lib/libLink.a.因为这里是把$(LOCAL_PATH) + $(LOCAL_SRC_FILES)作为LOCAL_SRC_FILES的值,即在算LOCAL_SRC_FILES之前,它已经有一个基目录$(LOCAL_PATH)。
include $(PREBUILT_STATIC_LIBRARY)
#dynamic library
include $(CLEAR_VARS)
LOCAL_MODULE := onemore
LOCAL_SRC_FILES := ./lib/libonemore.so
include $(PREBUILT_SHARED_LIBRARY)
#current module
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := mytest
LOCAL_SRC_FILES := \
./mytest.cpp
LOCAL_C_INCLUDES := \
$(TOP_PATH)/../..include
LOCAL_SHARED_LIBRARIES := onemore
LOCAL_WHOLE_STATIC_LIBRARIES := Link
include $(BUILD_EXECUTABLE)
6> cd ~/Mytest,执行$NDK_ROOT/ndk-build. 执行的时候只能在$Project当前应用程序的目录下执行编译.
到此编译结束了,希望我的辛苦和经历能为你带来些许帮助和参考。
注:
ARM指令有32位和16位两种指令模式,16位为thumb指令集,thumb指令集编译出的代码占用空间小,
而且效率也高,所以android的arm编译器默认用的是thumb模式编译.
android的编译系统中LOCAL_ARM_MODE变量的取值为arm或者thumb,代表32位和16位两种指令集,默认为thumb.
当APP_ABI := x86,LOCAL_ARM_MODE只能等于arm,代表32位的x86指令集。
ABI ---- "Application Binary Interface"
从NDKR6开始,Android就支持x86平台了,除了ARM平台之外。