Android Application.mk和Android.mk 同在应用程序里的jni目录时交叉编译步骤

1> 先配置ndk相关环境

        进入到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平台之外。

你可能感兴趣的:(android,jni,Path,include,library)