环境Ubuntu16.04
1、NDK下载与安装
下载:
在NDK官网下载对应平台的版本,我下载的是android-ndk-r10e-linux-x86_64.zip 网址是https://developer.android.google.cn/ndk/downloads/older_releases?hl=zh-cn
此处需注意的是,下载最新版本或者较高的版本的zip,解压后根目录下没有samples文件夹,后来下载了10e版本。
安装:
先unzip命令 解压下载的文件,解压后的文件夹为android-ndk-r10e
设置系统环境:
在~/.bashrc文件夹加入命令:
NDKROOT=/home/xx/Downloads/android-ndk-r10e export PATH=$NDKROOT:$PATH
保存退出后,执行 source ~/.bashrc
在根目录下android-ndk-r10e执行ndk-build, 如果说缺少某个文件,则说明安装成功,如果说没有ndk-build则未成功安装
还有另一种验证方式,就是验证samples中hello-jni.so能否顺利利用ndk-build生成。
2、利用一个cpp、h文件生成.so文件
准备文件:
在根目录下新建jni文件夹
查找并拷贝一个Application.mk到根目录;cd jni后,查找并拷贝一个Android.mk到jni文件夹,同时把需要编译的.cpp,.h文件拷贝到该文件夹中。
该版本下Application.mk需要在Android.mk的上一级目录,才能在Application.mk所在目录中顺利执行ndk-build。
修改:
注释掉Android.mk中的这两行,
#LOCAL_MODULE := hello-jni
#LOCAL_SRC_FILES := hello-jni.c
换成 LOCAL_MODULE := xx-jni
LOCAL_SRC_FILES := xx.cpp
添加要适用的android 平台:
TARGET_ARCH := arm
TARGET_PLATFORM := android-12
在Application.mk中需要添加APP_MODULES,与Android.mk的LOCAL_MODULE相同,如下:
APP_MODULES:=xx-jni
并添加:APP_ABI := armeabi,armeabi-v7a(可以按实际需求增、减)
此时在根目录下执行ndk-build,当然不可能顺利生成.so,会遇到问题:
a、cpp文件中的iostream和vector等c++库报错,找不到相应头文件
Application.mk中添加:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1
APP_CPPFLAGS := -fpermissive
APP_CPPFLAGS += -std=gnu++11
Android.mk中添加:
LOCAL_CPPFLAGS += -std=c++11
LOCAL_C_INCLUDES := /home/xx/Downloads/android-ndk-r10e/sources/cxx-stl/stlport/stlport
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_C_INCLUDES += bionic
LOCAL_C_INCLUDES += bionic/libstdc++/include
b、cpp中所使用的random报错,找不到头文件(貌似是,不太记得问题了)
Android.mk中添加:LOCAL_C_INCLUDES +=/home/xx/Downloads/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/include
Application.mk中添加:NDK_TOOLCHAIN_VERSION=4.8
c、std::相关函数报错 undefined
Android.mk中添加:LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
然后顺利生成了.so文件。