前提:
1.安装ndk
2.系统的环境配置
在系统的环境变量中添加变量ANDROID_NDK
内容为ndk的安装目录,我的是
C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle
之后在path中添加%ANDROID_NDK%;
3、在studio的file->Project Structure中配置ndk的安装路径
也可以在local.properties中配置路径
4、配置三个常用命令,其它不需要
5、配置gradle.properties
添加
android.useDeprecatedNdk=true
1、.mk编译
1、生成头文件
新建类,写native方法,右击类文件NDK->javah,生成jni目录,目录下有头文件
2、在jni下新建一个.cpp文件,进行函数实现
#include "com_tcxy_androidndk_Operator.h"
JNIEXPORT jstring JNICALL Java_com_tcxy_androidndk_Operator_getName(JNIEnv * env, jobject obj)
{
return env->NewStringUTF("Hello word !!!");
}
3、写两个.mk文件
Android.mk内容为
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mathwork
LOCAL_SRC_FILES := mathOpeartion.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk内容为
APP_ABI := all
然后右击jni文件选择NDK->ndk-build,生成libs和obj目录
4、修改module的build.gradle
在android{}内部添加
sourceSets {
main {
jni.srcDirs = [] //禁止ndk自动编译
jniLibs.srcDirs = ['src/main/libs'] //更改jniLibs默认地址
}
}
2、ndk自动编译
主要思想就是把.mk的任务交给gradle配置来实现。
先重做前文的1、2步
3、修改module的build.gradle
在defaultConfig {}内部添加
ndk {
moduleName "mathwork" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库
}
在android{}内部添加
sourceSets {
main {
jni.srcDirs = ['src/main/jni'] //可直接删除这行,系统默认位置就是src/main/jni
jniLibs.srcDirs = ['src/main/libs']
}
}
make 之后在app\build\intermediates\ndk\debug 中可以找到库文件