【NDK Lab】环境搭建以及so打包和使用

直入正题!

环境搭建

开发环境

  • MacBook Pro(macOS Sierra10.12.6)
  • Android Studio2.3.3
  • Gradle 2.3.3

NDK install

1、这里我是采用Android Studio自行安装的,打开AndroidStudio,选择顶部工具条,Tools->Android->SDK Manager->SDK Tools->NDK 点击install

NDK安装路径
设置NDK路径

2、也可以自行下载ndk包(去AndroidDevTools或者谷歌官方网站下载),下载ndk包后解析到某个路径,打开Project Structure->设置 NDK location,同上1设置NDK路径

3、NDK环境变量配置,我们需要使用到ndk-build命令,打开终端 -> 输入 :vim ~/.bash_profile -> 加入NDK 包的路径,具体怎么使用vim进行编辑请自行百度

配置NDK环境变量
配置NDK环境变量

4、保存文件,关闭.bash_profile,输入source .bash_profile或者重新开启一个terminal ,当前配置才会生效。 命令行输入ndk-build验证配置是否成功

总之:整个配置过程同Android SDK的配置一样

NDK开发实战

1、创建Android项目JniLab
2、查看项目local.properties中加入ndk和sdk的路径是否正确

ndk.dir=/Users/didi/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/didi/Library/Android/sdk

3、配置项目下的gradle.properties文件,表示我们要使用NDK进行开发(缺少这步会导致后续无法通过alt+enter快捷键生成jni文件夹)

android.useDeprecatedNdk=true

4、在moudle根目录下的的build.gradle中的defaultConfig标签内部里加入如下代码

ndk{    
 // 生成的so文件名字,调用C程序的代码中会用到该名字,需要保持一致    
moduleName "algorithm"     
// 输出指定三种平台下的so库
// 还可以添加 'x86_64', 'mips', 'mips64'
abiFilters "armeabi", "armeabi-v7a", "x86" 
}

5、编写jni代码
通过System.loadLibrary加载的库名要和上述4的moduleName一致,否则会出现java.lang.UnsatisfiedLinkError问题,找不到so库

JniManager

6、执行第5步的时候,如上图所示,对应native方法(getInfo)会提示找不到对应方法,快捷键 alt+enter 会生成对应jni文件夹,包含algorithm.c文件,此处的native方法还是会显示红色,但是不影响编译

jni文件夹生成

7、编译项目后会发现app/build中已经生成so文件,并且已经对应的cpu包就是我们在gradle中已经配置的,并且已经调用成功

build中生成对应so文件

PS:编译时可能碰到NDK_PROJECT_PATH = null问题

Messages Gradle Build

暂时的解决方法:将app module的compileSdkVersion与targetSdkVersion由之前的25改成24(可能也跟最新的NDK版本有关系)

成功调用native方法

打包出动态so文件,在其它项目中使用

有时候我们的需求是这样的,我们把一些比较重要的业务逻辑封装到ndk内部,对java层只暴露接口。我们就需要打包出so文件,并且可能需要在其他项目中使用,下面将介绍so(符合JNI标准)文件的打包,以及在其他项目中如何正确的调用

  • 编写Android.mk文件,放到jni文件夹根目录,与.c文件同级
    PS:注意中文注释或者中文空格带来的意外麻烦
LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
LOCAL_MODULE := algorithm
LOCAL_SRC_FILES := /Users/sus/example/JniLab/app/src/main/jni/algorithm.c
 include $(BUILD_SHARED_LIBRARY)
  • 使用ndk-build命令(需要配置NDK环境变量,参照上文NDK环境变量配置),生成so文件
  • 编写Application.mk文件,放到jni文件夹根目录,与.c文件同级
APP_PLATFORM := android-14
APP_ABI :=all //打包出所有cpu平台so文件

进入到main目录后在terminal中输入命令,ndk-build工具便会帮我们打包出所有cpu平台so文件

ndk-build
libs目录

其它项目使用该so文件

  • 拷贝so文件到项目的main/jniLibs目录
  • 新建package,包名与类名以及方法名必须与生成so文件的类保持一致!
  • 使用loadLibrary加载动态库,声明native方法

PS:这里如果你不想新建项目测试,你可以在main下新建jniLibs文件夹,把libs里的so放到jniLibs中,删除libs文件夹,然后删除jni文件夹运行也会起到类似在新项目中使用so文件的作用

  • 对于上面说的【包名与类名以及方法名必须与生成so文件的类保持一致!】这个规范,读者可能有疑惑,这样的约束太死板不够灵活,我们在使用一些包含so库的第三方SDK的时候并不记得有这么多限制
  • 的确如此,我们看下第三方SDK是怎么搞的,以Umeng Push SDK为参考来看一下,我们发现第三方库都会带有jar包,然后通过包里面去调用so文件,我们只需要使用jar包中暴露的接口方法即可,而上述的规范可能更适合内部人员之间开发和使用so
Umeng Push SDK

下载地址:JniLab

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

推荐阅读更多精彩内容