爱开发,爱鱼八! 我是yubaKevin!不是单身的程序猿! 主题:NDK开发 完美解析详细开发过程,菜鸟必备!android
由于太菜,因此想写文章学习,提高本身帮助他人!如若文章有误,请大佬提笔赐教,不慎感激!c++
随便转载,可是必定要附上原文连接哦,注上做者:@yubakevingit
个人github地址:github.com/YubaKevin 项目Demo在Trip-for-android里面,记得来个star哦github
详细参考资料:developer.android.com/studio/proj…bash
main下创建 jniLibs 文件夹,接着在jniLibs下新建.so对应的ABI文件夹(个人ABI是 armeabi-v7a) 用于存放第三方动态.so库 (必定要对应,这个的很重要)app
b.cpp下建立include文件 用于放.h头文件 (如有其余cpp文件 放置在cpp文件夹下,建立include只是便于区分管理)工具
项目结构图以下:post
defaultConfig {
externalNativeBuild {
cmake {
abiFilters "x86_64" "armeabi-v7a" "arm64-v8a" //能够所有 也能够任选其一,和.so要对应起来
cppFlags "-frtti -fexceptions"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
buildTypes {
debug{
minifyEnabled false
ndk {
abiFilters "x86_64" "armeabi-v7a" "arm64-v8a" //能够所有 也能够任选其一,和.so要对应起来
}
}
release {
ndk {
abiFilters "x86_64" "armeabi-v7a" "arm64-v8a" //能够所有 也能够任选其一,和.so要对应起来
}
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
复制代码
#我这里配置的是多个.so,若是你只是一个,只要复制一行就能够了
# CMake版本信息
cmake_minimum_required(VERSION 3.4.1)
# 支持-std=gnu++11 也能够换用换用--std=c++11 对c++ 11的支持
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
# 工程路径 绝对路径 能够不定义使用绝对路径,直接使用 ${CMAKE_SOURCE_DIR}
set(pathToProject G:/ASworkSpace/CommunicationTest/Communication)
# 配置加载native依赖 (头文件)
include_directories(${pathToProject}/app/src/main/cpp/include)
# 添加待编译的文件 使用相对路径 :${CMAKE_SOURCE_DIR}/src/main/cpp/interface.cpp
add_library(
native-lib
SHARED
${pathToProject}/app/src/main/cpp/interface.cpp
${pathToProject}/app/src/main/cpp/msl.cpp
${pathToProject}/app/src/main/cpp/native-lib.cpp )
# 动态方式加载
add_library(lib_one SHARED IMPORTED)
add_library(lib_two SHARED IMPORTED)
add_library(lib_three SHARED IMPORTED)
add_library(lib_four SHARED IMPORTED)
add_library(lib_five SHARED IMPORTED)
# 引入so文件
set_target_properties(lib_one PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libTcpCommunication.so )
set_target_properties(lib_two PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libevent.so)
set_target_properties(lib_three PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libevent_pthreads.so)
set_target_properties(lib_four PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libGCLogger.so)
set_target_properties(lib_five PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libMsgSessionLayer.so)
#查找库所在目录
find_library( # Sets the name of the path variable.
log-lib
log )
#连接库
target_link_libraries( native-lib
lib_one
lib_two
lib_three
lib_four
lib_five
${log-lib})
复制代码
CMakeLists图以下: 黄色箭头是须要关注的地方,lib_one 这里属于自定义命名
学习
a.在包下建立MyJniUtils包,再建立jniUtils类 (建议统一包名便于后期维护,这里要注意一下,后面会讲到) 开发工具
b.书写jni类接口代码 建议这里使用单例模式
public class JniUtils {
static {
System.loadLibrary("native-lib");
}
public static native String stringFromJNI();
public static native int adds();
}
复制代码
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_kevin_MyJniUtils_JniUtils_adds(JNIEnv *env, jclass type) {
return add(3,3); //add方法的实现是在.so里完成的,实现的是所传值的加法运算
//这里主要是实现C++方法等
}
复制代码
这里作一个总结,过程看起来繁琐其实熟练后很简单
就分为四步:
1.配置项目结构,放置须要的.so文件
2.配置bulidgradle和CMakeLists
3.建立jni类包,建立jniUtils,书写对应接口。在cpp文件下调用.so方法
4.运行调试
PS:注意写的时候要细心,有bug耐心解决,总会成功的。我也是经历了无数奇葩问题的(抱头哭)
复制代码