CMAKE
Android Studio在2.2之后添加了cmake,可在SDK中下载安装(ndk与CMake):
如果需要简单的模板示例,只需在新建工程的时候勾选 “Include c++ support”:
配置
新建文件(夹)
添加jni文件夹:
这里注意,新建的这个文件夹默认名称一般是:“src/main/jni/”,但是通过对照我们发现,新建出来在Android导航栏里显示的却是“cpp”(如果显示一致忽略即可),为了避免路径写错我们可以在这里把它的路径改为“cpp”(在project导航栏里refactor->rename)。
添加cpp/c文件:右击cpp文件夹,添加c++ 源文件
添加CMakeLists.txt:位置可选(后面注意相对路径的关系即可),文件类型选择file即可,可以与c++源文件放在一起,也可以放在工程app的主目录下(如果要在app主目录下建立文件,可在project导航栏中操作):
(该操作为演示在app主目录下添加文件,后文的代码则以CMakeFileLists.txt位于cpp文件夹为例。)
配置gradle(注意是app下的build.gradle)
android {
...
externalNativeBuild {
cmake { //指定编译工具为cmake
path "./src/main/cpp/CMakeLists.txt" //此处路径是相对于app主目录的路径
}
}
}
上面是必须部分,需要更多的使用可转到文末的参考链接。下面给出一个常用的控制编译版本的方法:
android {
...
defaultConfig {
ndk {
abiFilters 'armeabi','x86','armeabiv7a','arm64v8a','x86','x86_64','mips','mips64' //根据需要可选一个或多个
}
}
} //注意关系结构,大括号有点多
配置CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1) #版本号,使用默认值(默认值应该是从模板创建时默认的参数吧)或者3.4.0以下数值
add_library( #添加编译目标(即.so)
aaaa #编译目标名称(不要指定为libxxx.so,名称中平台相关参数会自动添加)
SHARED #SHARED 或者 STATIC ,默认SHARED (共享/静态链接库)
aaaa.cpp ) #源代码文件路径,相对路径(注意是从CMakeLists.txt所在路径的相对路径,如果CMakeLists.txt位于app主目录下,则此处应为./src/main/cpp/aaaa.cpp;若CMakeLists.txt位于cpp目录下,则为aaaa.cpp)
find_library( #寻找外部依赖库,并定义变量引用
log-lib #将外部依赖库定义为变量,即此处名称任意,只要自己知道就好
log ) #外部依赖库的名称,同add_library的命名规则,不要添加任何平台相关参数
target_link_libraries( #链接(此处为将aaaa链接到log-lib,使aaaa可以调用log-lib中的内容)
aaaa #需要被链接的目标
${log-lib} ) #需要链接的目标,使用上面定义的变量进行引用
#注意,注释为单行注释,如复制时出现换行会导致编译失败,请删掉不必要注释
配置完成
到这里需要的配置已完成(cpp文件里不需要任何内容)。
由于gradle做了更改,需要sync一次。此时可能会有报错,是因为我们修改了CMakeLists.txt而没有应用,执行build->refresh linked c++ project即可(若代码检查无问题而依旧爆出一堆错误,那make,refresh交替进行一次有可能解决…..只是有可能)。
添加代码
直接在java文件中进行函数声明,按提示即可:
由于默认类名与c源文件名是对应创建的,所以你需要将自动创建的代码放到本工程里。使用时记着loadlibrary加载so。
参考:
http://blog.youkuaiyun.com/joe544351900/article/details/53637549(此文章写得更详细,我这里只是简略的给出了基本搭建)