android NDK 安装与简单.so生成

环境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文件。

原文地址:https://www.cnblogs.com/xiaoheizi-12345/p/12531925.html