NDK开发:使用CMake构建native代码

使用ndk-build构建native代码看这一篇NDK开发:使用ndk-build构建native代码

第一步:

定义java 本地接口文件JNIUtils

public class JNIUtils {
    //静态代码块加载动态库(moduleName)
    static {
        //字符串内名字需要跟下文中Android.mk文件LOCAL_MODULE := my_jni,的my_jni一致.
        System.loadLibrary("my_jni");
    }
    //native定义jni在方法
    //这里简单从native代码中获取字符串
    public native String getStringFromJni();
}
}

第二步:(可选)

在app build.gradle defaultConfig中添加自己想支持的构架

 ndk{
            // 设置支持的 SO 库构架
            abiFilters "armeabi-v7a", "arm64-v8a"
        }

第三步:

main目录下创建jni目录(也有些人创建cpp目录,不过都可以,不影响)
image.png
在jni目录下创建jni原文件jnitest.c
#include 
JNIEXPORT jstring JNICALL Java_com_leory_ndkdemo_JNIUtils_getStringFromJni
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"This is Jni test!");
}

Java_com_leory_ndkdemo_JNIUtils是上面JNIUtils路径,getStringFromJni对应的是方法名
这里简单的返回一个字符串

在jni目录下创建 CMake 构建脚本CMakeLists.txt(相当于ndk-build构建的Android.mk)

${CMAKE_SOURCE_DIR}代表是CMakeLists.txt所在的目录,也可以去掉

# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

# 编译library
# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

# 编译library
add_library( # 设置library名称
             my_jni

             # 设置library模式
             # SHARED模式会编译so文件,STATIC模式不会编译
             SHARED

             # 设置原生代码路径
             ${CMAKE_SOURCE_DIR}/jnitest.c )
关联gradle和CMake:app module下右键选择
image.png

选择CMake构建,然后选择刚刚创建的CMakeLists.txt文件路径


NDK开发:使用CMake构建native代码_第1张图片
image.png

按ok确定后会自动在app build.grade 的android中生成下面代码(当然也可以手动添加),并编译

 externalNativeBuild {
        cmake {
            path file('src/main/jni/CMakeLists.txt')
        }
    }

生成的对就应的so文件在build->intermediates->cmake下


NDK开发:使用CMake构建native代码_第2张图片
image.png

第四步:

在代码中调用


image.png

页面显示成功


image.png

第五步:(可选)

完成上面一上就已经成功了,不过每次都会调用了cmake生成so文件,所以如果我们不经常改jni源代码,我们可以直接使用生成的so文件。

我们把生成的so文件复制到libs目录下(没有libs目录就新建一个)


image.png

然后在build.gradle android 中指定jniLibs的目录

  sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

接着把上面cmake构建的代码注释掉(需要重新编译的时候再打开),不然又会生成so文件与libs目录so文件冲突

//    externalNativeBuild {
//        cmake {
//            path file('src/main/jni/CMakeLists.txt')
//        }
//    }

你可能感兴趣的:(NDK开发:使用CMake构建native代码)