Android Studio 2.2以上支持了Cmake的配置JNI的相关参数
Android Studio 2.2以上支持了Cmake的配置JNI的相关参数,简化了通过Android.mk配置。并很好的继承了C++的编辑方式。以下是对应的引入第三方so和第三方.cpp文件的路径脚本编写。对应于:CMakeLists.txt
设置CMake插件的版本
# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build. cmake_minimum_required(VERSION 3.4.1)
定义要编译的源代码和最终要生成的库文件名称及类型
# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK. #语法,参考:https://cmake.org/cmake/help/latest/command/add_library.html
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
# 语法######################################### # 示例
add_library(
#编译生成的库的名称,注意最终生成时会在前面加`lib`.
# Specifies the name of the library.
native-lib # Sets the library as a shared library.
# 生成的库的类型,有SHARED,STATIC,MODULE
SHARED # Provides a relative path to your source file(s).
# 要编译的源代码文件
src/main/cpp/native-lib.cpp )
包含要编译的源码头文件
如果有源码文件有头文件,自然需要包含:
# 语法, 参考:https://cmake.org/cmake/help/latest/command/include_directories.html
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
# 语法######################################### # Specifies a path to native header files.
# 注意这里指定的是头文件的目录
include_directories(src/main/cpp/include/)
使用NDK中的Api
有时候我们发现需要使用到NDK中定义的Api,因为NDK中的API都已经是编译好的,而且CMake会自动去NDK目录中查找这些我们需要使用的库,所以这里只需要提供库的名称就可以了,一下举例加载NDK中的log库,因为我们在NDK开发中,总是少不了要打印日志的。
- 首先查找要使用的库,使用变量保存它的路径。
# 语法,参考:https://cmake.org/cmake/help/latest/command/find_library.html
# A short-hand signature is:
# name1 保存库路径的变量
find_library (<VAR> name1 [path1 path2 ...])
# The general signature is: find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
# 语法######################################### # 示例
# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included 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. 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 ) 为了编译时可以使用,需要将上面一步找到的库链接到我们要编译的库中。
# 语法,参考: https://cmake.org/cmake/help/latest/command/target_link_libraries.html
target_link_libraries(<target> ... <item>... ...)
# 语法 end ####################### # Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.
# 注意这里可以同时链接多个库
target_link_libraries( # Specifies the target library.
native-lib # Links the log library to the target library.
# 此处使用上面保存的变量
${log-lib} )
NDK中也有一些库是以源代码的方式存在的,这个时候如果我们要使用它,就需要把它编译到一个本地静态库中,再链接到我们要生成的库中。
# 这样就会在\app\.externalNativeBuild\cmake\debug\${ANDROID_ABI}\ 目录下生成libapp-glue.a/静态库
add_library( app-glue
# 以静态的方式添加
STATIC
# 该源码用于管理`NativeActivity`生命周期事件和触摸事件
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )
# You need to link static libraries against your shared native library.
# 链接到库中
target_link_libraries( native-lib app-glue ${log-lib} )
添加第三方的库
使用add_library添加第三库
# 语法,因为已经编译好了,所以使用`IMPORTED`关键字
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL]) # 示例
add_library( imported-lib
SHARED
IMPORTED )
当第三方库有针对不同架构编译了不同的库版本时,有时候我们只需要引入我们想要的版本的库,当我们想要引入多个版本的库时,可以使用ANDROID_ABI变量,它表示默认的ABI架构和NDK支持的架构,如果我们在build.gradle中设置了过滤值,则表示过滤后的架构集合。
set_target_properties( # Specifies the target library.
imported-lib # Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION # Provides the path to the library you want to import.
# 注意下面的imported-lib是在项目的app目录下的
imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
同时为了在编译时的使用,我们需要导入所依赖的库的头文件
include_directories( imported-lib/include/ )
添加链接,以便在编译的时候使用,注意如果要添加的第三方库在编译我们要产出的库时不需要直接用到(比如一个库是imported-lib所依赖的),则不需要执行以下步骤。
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
在build.gradle中配置编译库的脚本
android {
......
defaultConfig {
......
//在默认配置中配置 cmake 的一些参数
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang"
cFlags ""
cppFlags ""
}
}
//ndk 配置
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
'arm64-v8a'
}
}
//配置库编译的脚本
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
//定义不同的产品类型(多渠道打包),通过复写externalNativeBuild,使用target字段实现打包不同的so库。
productFlavors {
...
demo {
...
externalNativeBuild {
cmake {
...
// Specifies which native libraries to build and package for this
// product flavor. If you don't configure this property, Gradle
// builds and packages all shared object libraries that you define
// in your CMake or ndk-build project.
targets "native-lib-demo"
}
}
}
paid {
...
externalNativeBuild {
cmake {
...
targets "native-lib-paid"
}
}
}
}
}
Android Studio 2.2以上支持了Cmake的配置JNI的相关参数的更多相关文章
- Android Studio的安装及第一次启动时的配置
Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...
- Android Studio Gradle 添加.so 支持文件
近期发展Android Wear 关注商品.官员Demo所有gradle 工程. 当然,我也用eclipse配置一个可行的环境. 问题来了,eclipse,android studio 开发 andr ...
- 在Android Studio上进行OpenCV 3.1开发环境配置
开发环境: Windows 7 x 64 家庭版 Android Studio 1.5.1(Gradle版本2.8) JDK 1.8.0 Android 6.0(API 23) OpenCV 3.1. ...
- 如何在Android Studio中添加RecyclerView-v7支持包
1.打开SDK Manager,在Extras树下找到Android Support Library,下载好支持包.RecyclerView在v7-21版本就出来了.我这里不用更新了,说明是最新的,怎 ...
- Android Studio的HAXM不支持虚拟机
因为我的计算机是服务器,不支持虚拟机,所以报这个错了. 解决方式是直接连接物理手机,打开USB调试,安装驱动,运行项目即可.
- Android Studio的project中两个build.gradle配置的区别
一般创建一个android项目后回出现两个gradle: build.gradle(Project):用来配置整个工程的 build.gradle(app):一个是用来配置app的 对compile和 ...
- Android studio 在一个项目上添加另一个项目,引用其内部参数
Setting.gradle 里面 添加 include ':app',‘imagePicker’ 其中 imagePicker 为要引入的项目名 build.gradle(Module: app) ...
- android studio使用CMake和NDK,实现应用自身被卸载时打开某一网址
实现应用自身被卸载时打开某一网址的c代码 MyActivity: public class MyActivity extends Activity { /** * Called when the ac ...
- android studio NDK配置
向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运行示例应用 向现有项目添加 C/C++ 代码 创建新的原生源文件 创建 CMake 构 ...
随机推荐
- AJAX的dataType问题
dataType是预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 中,JSON 就会 ...
- Oracle 函数-字符型函数
1.字符型函数 函数 说明 案例 结果 ASCII(X) 求字符X的ASCII码 select ASCII('A') FROM DUAL; 65 CHR(X) 求ASCII码对应的字符 select ...
- Java泛型读书笔记 (三)
泛型对于老代码的支持 Java的泛型设计成类型擦除的目的,很大一部分是为了兼容老老代码.如下的一段代码: void setLabelTable(Dictionary table) table的类型是非 ...
- jQuery+css实现tab功能
点击我我会消失 Click me 点击按钮我会消失,再点击我会出现 演示tab tab1 tab2 tab3 [环球时报记者 郭芳] “中国秘密发射新快速响应火箭”,25日,在中国官方媒体报道我国“快 ...
- Quick Reference Card Urls For Web Developer
C# C# Cheatsheet & Notes Coding Guidelines for C# 3.0, 4.0, 5.0 Core C# and .NET Quick Reference ...
- ECS简介
https://www.cnblogs.com/yangrouchuan/p/7436533.html Unity下的ECS框架 Entitas简介 最近随着守望先锋制作组在gdc上发布的一个关于 ...
- J2SE-鸡汤
前言 终于开始学java了,心里免不了的开心,总是听老乡说他们公司搞java开发,用的什么什么框架,说的自己都有点眼馋了,但是根据自己的性格,不了解它,肯定不会就去用它的.所以在学习框架之前,java ...
- win10更新后IE不见了
只是快捷方式不见了,到C:\Program Files\internet explorer\iexplore.exe就看到了,可以正常运行
- 记一次IIS应用程序域崩溃的原因
在日常工作中,每次新的功能上线前,我们会搭建一个测试环境提供给客户测试使用,确定无误后才会更新到正式环境上.这一次也不例外,在约定好时间地点,客户进行集中化测试的过程中,反应网站系统打不开,报500错 ...
- 状压DP 【洛谷P3694】 邦邦的大合唱站队
[洛谷P3694] 邦邦的大合唱站队 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...