Android NDk-JNi开发(三)、JNI简便开发流程,使用Cmake进行开发

1、使用cmake需要的环境

安装图片红框中的
Android NDk-JNi开发(三)、JNI简便开发流程,使用Cmake进行开发_第1张图片

2、创建一个工程,如下,勾选 Include C++ support选项

Android NDk-JNi开发(三)、JNI简便开发流程,使用Cmake进行开发_第2张图片

3、项目中会出现一个CmakeLists.txt文件,

Android NDk-JNi开发(三)、JNI简便开发流程,使用Cmake进行开发_第3张图片

里面的详细内容:

cmake_minimum_required(VERSION 3.4.1)//版本

//这个就是将我们的native-lib.cpp文件,生成最后的native-lib.so库文件
//这句话用java语言解释就是将native-lib.java文件编译成.class文件,然后打成native-lib.jar包
add_library( 
             #库的名字叫native-lib,最终会为我们生成native-lib.so
             native-lib
             
             #SHARED表示动态库,会被动态链接,在运行时被加载
             #STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用
             #MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接
             SHARED
             
             #/src/main/cpp/native-lib.cpp:这个c++的源文件
             src/main/cpp/native-lib.cpp )
             
//add_library可以拥有多个
add_library(
             jni_test
             SHARED
             src/main/cpp/jni_test.cpp )    

//添加一些我们编译所需要依赖的本地库。比如,我们这里使用的log库(此处的log库是我们后面调试时需要用来打log日志的库,是NDK为我们提供的),并给log库起了个别名log-lib,方便后面使用。主要的作用:如果要更换log库,只要更改这一处就行,而不用处处修改。        
find_library(
              log-lib
              log )
              
//链接   链接了刚刚创建的native-lib.so,并且是有顺序的,必须和add_library从上到下的顺序一样而且名字必须一样    
//当然也可以链接其他库,如GLESv2库,log 日志库等
target_link_libraries( 
                       native-lib // add_library第一个是 native-lib
                       jni_test   // add_library第二个是  jni_test
                       GLESv2
                       #这里可以将${log-lib}修改成log。这么写的好处上面也说了,主要是方便修改
                       ${log-lib} )

四、gradle的相关配置

android {
    defaultConfig {
        //这个是告诉我们,将我们的.cpp或者.c源文件去编译哪个平台下的so库
        //如果不添加过滤,就是全平台。基本上android用不到全平台的.so库,现在手机大部分是arm、arm-v7a
        externalNativeBuild {
            cmake {
                //给C++编译器的一些参数。与之对应的还有一个cFlags,cFlags就是给C编译器的一些参数
                cppFlags ""
                //添加了这个过滤,打包之后就只有一个armeabi-v7a.so库
                abiFilters 'armeabi-v7a'
            }
        }

        ndk{
            //这个与上面的区别就是编译其他的.so。比如工程里用到了高德地图,配置了这一行进行打包的时, 候,只会将高德armeabi-v7a打包进apk里,其实还是一个过滤的作用,如果项目中没有使用其他第三方的so库,可以不用
            abiFilters 'armeabi-v7a'
        }
    }
    //配置CMakeLists.txt的地址。CMakeLists.txt可以写在电脑任何地方,在这配置一下地址就好了
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

最后如果是一个老项目使用cmake,先创建一个cmakeLists.txt文件,然后按照上面 步骤3 去配置cmakeLists.txt文件,最后按照步骤4配置好gradle文件,就可以了。

你可能感兴趣的:(JNI)