写文章的原因就是为了记录一些学过的东西,方便以后忘记了可以快速找回来。
以下步骤是基于android studio 2.3的版本,更高版本的as对于ndk的支持更好,可以在创建目录的时候,勾选include c++ surport可以直接完成下面步骤的配置
1.先配置ndk
2.local.properties下面可以查看ndk路径
ndk.dir=C\:\\android\\sdk\\ndk-bundle
sdk.dir=C\:\\android\\sdk
3.新建JniTest类
4.生成头文件 ,先把项目编译,生成.class文件,编译后可以在build/intermedietes/classes/debug 包名下找到编译好的class文件,如下图:
5.打开android studio自带终端Terminal,进入 app/src/main目录下,输入命令
javah -d jni -classpath ../../build/intermediates/classes/debug cn.lgh.myndk4.JniTest
生成头文件,注意需要配置好环境变量,进入app/src/main目录下的目的是,在生成头文件的时候,-d jni 可以直接把jni目录放到main目录下
值得注意的是,在使用javah的时候,出现error running javah src\main\java does not exist的错误,出现该错误的原因是,高版本的jdk在低版本的 jvm环境上运行,解决这个问题的方法就是让jdk版本和jvm环境版本保持一致
6.生成头文件后,可以在app/src/main下看到生成好的头文件
7.在app/src/main/jni目录下新建C代码源文件MyNative.c 和Android.mk文件
Android.mk文件中的LOCAL_MODULE :=hello指定的是生成动态库的名字,LOCAL_SRC_FILES :=hello.c关联的是jni目录下的.c文件。
8.在build.gradle文件上的defaultConfig节点下添加
ndk {
moduleName"MyNative"
ldLibs"log"
abiFilters"armeabi-v7a"
}
和在android节点下添加
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir"src/main/libs"
}
编译会根据配置生成不同的目录来存放 .so文件!
参数配置:
在defaultConfig中添加一个ndk{}
ndk{}可添加的属性如下:
moduleName "xxx" : 编译后so库的名字
ldLibs "xxx" "xxx" : 连接的库,可以有多个
abiFilters "xxx" "xxx" :
so库运行的cpu架构,有armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64这些,常用的是armeabi和armeabi-v7a
stl "xxx" : C++ runtime support library,共有九种
cFlags "xxx" "xxx" : 编译选项
9.生成动态链接库.so文件
使用ndk-build命令直接生成动态链接库,在Terminal中,如下
E:\workspace\MyNdk4\app\src\main>ndk-build
成功后,可以lib目录下看到所生成的.so文件
网友评论