ndkbuild 与 cmake

在 Android 项目中使用 jni 有两种编译方案,一种是传统的ndkbuild,一种是当前推荐使用的 cmake;下面来分别介绍这两种方式;我的AS版本 3.2:

 

1.ndk-build方式配置方式:

1.创建Android.mk文件,这里我创建在cpp目录中,这个目录可以自己定,之后在build.grade中设置就行了

2.编写Android.mk

 

#每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。宏my-dir 则由Build System提供。返回包#含Android.mk的目录路径。

LOCAL_PATH := $(call my-dir)

 

#CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.

#例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.

#这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响

include $(CLEAR_VARS)

 

#LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加适当的#前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀

 

#如果您将模块命名为'libfoo',构建系统将不会添加另一个'lib'前缀并生成libfoo。所以。

#这是为了支持Android。来自安卓平台的mk文件,需要用到这些

LOCAL_MODULE := native-lib

 

 

#用于指示C/ c++编译器在其中查找头文件的其他目录。这些路径是在最上层的下面。如果在include路径中有自己的子目录,则使用LOCAL_PATH。

#有些库如果没有引入成功,代码中没有提示,就是因为这里没有配置对;

#下面的例子中 LOCAL_PATH 代表上面设置的目录,即当前Android.mk文件所在目录,NDK_ROOT 指的是ndk安装所在的目录

LOCAL_C_INCLUDES+= $(LOCAL_PATH)/includes \

$(NDK_ROOT)/sources/cxx-stl/llvm-libc++/include \

$(LOCAL_PATH) \

$(JNI_H_INCLUDE)

 

#LOCAL_SRC_FILES变量必须包含一个C和/或c++源文件列表,这些源文件将被构建和组装到一个模块中。注意,您应该

#这里不列出头文件和包含的文件,因为构建系统将自动为您计算依赖关系;只列出源文件

#它将直接传递给编译器,您应该会做得很好。

#注意,c++源文件的默认扩展名是'.cpp'。但是,可以通过定义变量来指定一个不同的变量

#LOCAL_CPP_EXTENSION。不要忘记起始点。”。cxx'将工作,但不是'cxx')。

LOCAL_SRC_FILES := native-lib.cpp

 

 

LOCAL_LDLIBS := -lm -llog

 

#BUILD_SHARED_LIBRARY是构建系统提供的一个变量,它指向一个GNU Makefile脚本,该脚本负责收集所有的

#自最新的“include $(CLEAR_VARS)”以来在LOCAL_XXX变量中定义的信息,并确定要构建什么以及如何构建

#完全正确。还有BUILD_STATIC_LIBRARY来生成静态库

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。

它负责收集自从上次调用 include $(CLEAR_VARS)  后的所有LOCAL_XXX信息。并决定编译为什么。

NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。

BUILD_STATIC_LIBRARY    :编译为静态库。 

BUILD_SHARED_LIBRARY :编译为动态库 

BUILD_EXECUTABLE           :编译为Native C可执行程序  

BUILD_PREBUILT                 :该模块已经预先编译

 

include $(BUILD_SHARED_LIBRARY)

 

3.配置app下面的build.grade:

 

在android节点下添加:(这一步也可以在项目文件app上右键--》Link C++ with gradle --》选择ndk-build,选择Android.mk路径 来添加)

android{

externalNativeBuild {

ndkBuild {

path file('src/main/cpp/Android.mk')

}

}

 

在android defaultConfig节点下添加:

android{

defaultConfig{

//ndk-build配置

ndk {

abiFilters "x86","arm64-v8a","x86_64","armeabi-v7a" //表示.so生成的目录

}

}

}

 

 

好,到此为止,ndk-build编译方式的简单配置就可以了,native-lib.cpp中的代码提示也有了,运行完美。查看生成的.so文件,如图:

 

 

2.cmake方式配置:

cmake现在是谷歌默认的方式,比较推荐:

 

1.在项目app下创建 CmakeLists.txt文件:

 

2.编写CmakeLists.txt:

# For more information about using CMake with Android Studio, read the

# documentation: https://d.android.com/studio/projects/add-native-code.html

 

# Sets the minimum version of CMake required to build the native library.

#用来设置在编译本地库时我们需要的最小的cmake版本

cmake_minimum_required(VERSION 3.4.1)

 

# Creates and names a library, sets it as either STATIC

# or SHARED, and provides the relative paths to its source code.

# You can define multiple libraries, and CMake builds them for you.

# Gradle automatically packages shared libraries with your APK.

#创建并命名一个库,将其设置为静态

#或共享,并提供到其源代码的相对路径。

#您可以定义多个库,CMake为您构建它们。

# Gradle自动将共享库打包到APK中。

 

add_library(

# Sets the name of the library.

#生成.so文件的名字

native-lib

 

# Sets the library as a shared library.

# 设置生成的库为动态库,也可以生成动态库STATIC

SHARED

 

# Provides a relative path to your source file(s).

# 表示参与编译的文件的路径,这里面可以写多个文件的路径。

src/main/cpp/native-lib.cpp )

 

# Searches for a specified prebuilt library and stores the path as a

# variable. Because CMake includes system libraries in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

#搜索指定的预构建库并将路径存储为

#变量。因为CMake在搜索路径by中包含了系统库

#默认情况下,您只需要指定公共NDK库的名称

#CMake验证库在完成构建之前会检查库是否存在

 

find_library( # Sets the name of the path variable.

log-lib

 

# Specifies the name of the NDK library that

# you want CMake to locate.

log )

 

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

#指定库CMake应该链接到目标库。你

#可以链接多个库,比如您在本文中定义的库

#构建脚本、预构建的第三方库或系统库。

 

target_link_libraries( # Specifies the target library.

native-lib

 

# Links the target library to the log library

# included in the NDK.

${log-lib} )

 

3.在app下build.grade中添加:

在android节点下添加:

android{

externalNativeBuild {

cmake {

path "CMakeLists.txt"

}

}

}

 

在android defaultConfig节点下添加:

android{

defaultConfig{

externalNativeBuild {

cmake {

cppFlags "-std=c++11"

}

}

}

}

 

cmake的配置就结束了,运行完美,生成的.so文件如下:

 

 

 

 

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. [置顶] 自己开发的Android(安卓)软件发布贴(11月6日)
  6. android 动态库死机调试方法
  7. android流量监测的实现原理
  8. Android数字签名解析(二)
  9. 更改android avd emulator 按键不可用

随机推荐

  1. Android app处理全局exception
  2. Android 打包问题
  3. android handler 线程机制的研究
  4. Android(安卓)Program type already pres
  5. android常用adb快捷命令一览表
  6. Android(安卓)Switch 修改文字颜色
  7. Android中的后台邮件发送
  8. Android OkHttp3工具类封装
  9. 输入键盘始终停留以及尺寸转换得到默认字
  10. Head Fisrt Android Development读书笔记