Android JNI之青春期 Cmake(android studio)

缘起

生活不止眼前的苟且,还有诗与远方。如果你是个菜鸟,想成为一个万人敬仰的大神,那么你不妨先给自己定个小目标,比如说先活它个200年,然后向天再借500年。嗯,第一次听到它的时候,一颗心不停的颤抖,好像前生彼此曾拥有,今生却等了很久很久。跨平台作业的脚本,简单的风格,正处于青春期的 cmake,蓬勃的生机与活力,让人忍不住为之着迷。

介绍

Cmake 是什么?巨头百度说了:
CMake 是一个跨平台的安装工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试所支持的C++特性,类似UNIX下的automake。CMake 可以编译、制作、产生适配器(wrapper)、还可以用任意的顺序建构。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。“CMake”这个名字是“cross platform make”的缩写。
简单而言,对于我们,就是生成so。

准备工作

对于 cmake,as 的支持来得有点晚,直到 as 2.2 之后才开始。所以 as 较低版本的,请升级,如有不便,请联系谷歌客服。升级完毕,打开 SDKManager,还有几个小插件需要安装。比如说 cmake 插件,这个你不装不行,如果,假如说如果,不好意思这里没有如果。比如说 NDK 插件,套用官方的话说,原生开发工具包,允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库。比如说 LLDB 插件,调试原生代码,可选项,推荐使用。


勾选情况图

上图,从官网文档截取,请自主勾选需要项。如果你嫌烦,一键勾选所有,耐心等待个三天三夜,我连手带脚支持。

征程开始

出师未捷身先死,啊呸,这个,这个我们还是回归正题,开始我们的 hello jni 征途。一个目标(项目支持 cmake),两条途径。其中一条捷径,创建一个新项目,选中 Include C++ Support 复选框。对于这种方式,没什么需要解释的,下一步,下一步。


Include C++ Support 复选框

另外一条就是在已有项目中支持 cmake,分几个步骤。
步骤1. 在 src/main 目录下创建一个目录,取名叫 cpp。这个命名随意,你喜欢就好。把需要引入的代码放入创建的目录下,这里千万别随意,不能闹情绪。
步骤2. 创建 CMake 构建脚本,一个纯文本文件,取名 CMakeLists.txt,这个命名固定格式,不允许有脾气。至于这个文件你放哪里,随你喜欢好了。


我的选择

步骤3. 在 app module 中的 build.gradle 文件中,给予 cmake 支持。
android{
    ...
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

第一个配置,声明 Native Build 方式为 cmake,并指定 cmake 脚本路径。

android{
    ...
    defaultConfig{
      ...
      externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }
    }
}

哟哟,走过路过看过别错过。第二个配置,设置 cmake 编译的条件,比如说 c11++ 标准。同样都是 externalNativeBuild,这里是在 defaultConfig 域,而 cmake path 是 android 域。我有时候想,为什么不合二为一呢,非要让人写两遍,头疼,此处不求甚解。

征途关键,cmake 的配置

cmake 的文档,E文,让人沉醉于其中,不能自拔。有这么几个 api,比较重要。
重要1. add_library,生成 lib。对于我们而言,System.loadLibrary("xxx"),这里的 xxx 就是我们的lib。 示例如下:

# 创建一个 lib,静态 or 动态,可创建多个
add_library( # lib名称
             JniDemo

             # lib类型
             SHARED

             # .c/cpp目录
             jni_dynamic.cpp )

重要2. set_target_properties,用来使用 .a 等已构建好的 lib。示例如下:

# 添加自己的 lib 库
add_library( libHello
             SHARED
             # 由于.a 已经属于已经构建好的库,使用 IMPORTED 标志,告诉 cmake 不需要编译了
             IMPORTED )

set_target_properties(
                    #名称
                    libHello

                    # 指定要定义的参数.
                    PROPERTIES IMPORTED_LOCATION

                    # 导入 lib 的路径
                    ${CMAKE_SOURCE_DIR}/sources/${ANDROID_ABI}/libHello.a)

重要3. find_library,查找 lib。示例如下:

# 搜索 NDK 指定 lib
find_library( # lib 路径变量的名称。
              log-lib

              # 查找指定 lib 名称
              log )

重要4. target_link_libraries,链接所有 lib,生成新的 lib,示例如下:

# 链接库
target_link_libraries( # 指定目标 lib
                       JniDemo

                       # 自己的 lib
                       libHello

                       # NDK log lib  //这里放 find 的路径 ${log-lib} 也是可以
                       log )

暂且就讲这么几个,基本上应该也差不多可以满足了。如果,那么请自觉查看 cmake 文档,我想你会喜欢的。这里有个事还是提一下,对于上边四个重点,有两个是重中之重。重点1,是生成 lib,建立 java 与 c/c++ 之间的桥梁。重点4, 是链接所有 lib, 建立一个完整的可运行 lib。这两个,基本也可以解决问题了。至于多余的两个重点,为了结构比较清晰,直观罢了。

分享征途喜悦

到了这,jni 就告一段路了。至于前边想的,算是有一个可喜的圆满结局了。我之所以这么认真的待 jni,是因为我愿意,我喜欢。若能以此换回对 jni 的认知,了解,固然可喜。如是没有,我也没有什么可后悔的了。
附送一张github机票,带你领略世界的浩瀚

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容