一、介绍
Android Studio 编译JNI代码有两种方式:cmake 和 ndk 方式
使用感受:
1、cmake方式会受到所用Android sdk版本的影响,主要是ndk的版本影响,没有深入去探究原理
2、ndk方式可以跨Android sdk 版本运行
二、CMAKE方式的配置
说明:1、build.gradle 设置编译方式externalNativeBuild;
2、cmakelist.txt配置需要的cpp文件,和lib名字;
3、如果不需要每次都编译,直接在build.gradle 注释掉,把so文件放到指定目录jniLibs就好
1)修改build.gradle文件
build.gradle 路径
build.gradle 内容
2)修改cmakelist.txt文件
cmakelist.txt 路径
cmakelist.txt 文件内容:需要编译多个路径下的cpp文件,可以采用 file(glob flag "/xxx/*.cpp") 定义好路径,然后在add_library(lib名字 shared 方式参数 ${flag}) $为引用变量的方式,如下图
文件路径
3)取消每次重新编译so文件
取消每次都重新编译so文件,注释如下内容即可
Android studio支持从一个默认的jniLibs的目录获取各个平台的so文件,如下把以前编译好的放置好就行
三、NDK方式的配置
说明:1、build.gradle 设置编译方式externalNativeBuild;
2、android.mk配置需要的cpp;
1) build.gradle 设置android里面的ndk moduleName,设置externalNativeBuild配置文件为 android.mk文件路径
2) android.mk文件配置 配置所有cpp文件名称进入src_files
四、源文件
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
....//省略
// 采用cmake编译
externalNativeBuild {
cmake {
cppFlags ""
}
}
// 采用ndk编译
// ndk {
// moduleName "prolib" //so文件名
// }
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 采用cmake编译
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
// 采用ndk编译
// externalNativeBuild {
// ndkBuild {
// path "src/main/jni/Android.mk"
// }
// }
}
cmakelist.txt文件
cmake_minimum_required(VERSION 3.4.1)
file(GLOB native_srcs "src/main/cpp/*.cpp")
file(GLOB native_srcs_xx "src/main/cpp/xx/*.cpp")
add_library( native-lib
SHARED
${native_srcs}
${native_srcs_xx}
)
find_library( log-lib
log )
target_link_libraries( native-lib
${log-lib} )
android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := prolib
LOCAL_CPP_EXTENSION := cpp
LOCAL_SRC_FILES :=prolib.cpp xx.cpp\
aa.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)