从Android支持JNI开始,越来越多的开发者使用jni开发,我们新建一个native工程时,android studio默认给工程生成了CmakeLists文件和简单的native-lib.cpp文件,CmakeLists文件下生成动态链接库的核心代码为
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp )
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
有兴趣的同学可以新建一个工程看看,因为只有一个native-lib.cpp文件,所以这样写是没问题的。但是,在实际开发中,我们可能会有几十上百个.cpp文件,这时候如果还手动对每个文件添加,那是不是会非常繁琐呢,每次删除或者增加.cpp文件都要手动修改CmakeLists文件,作为程序员,完全无法容忍。
所以,接下来我们自己配置,将所有的.cpp,.c文件一起打包成一个so,当然,有需求的可以打包成多个so。不需要每次都修改CmakeLists文件。工程目录大概如下:
其中native-lib.cpp和CmakeLists.txt为新建工程时自动生成的文件,我们新建了一个MyLinkList.cpp和对应的头文件MylinkList.h。
文件中具体的代码我们暂时不谈,本编文章主要讲如何编写Cmake。
话不多说,直接贴出CmakeLists.txt中的内容
为了简洁,我将多余的注释都删掉了,上面的注释已经很详细了,相信每一步都能看懂。
到这一步,配置就完成了,此时我们来编译看看是否能生成我们想要的jniSdk-lib.so,
如上图,点击gradle->assemble,提示编译完成后,确实已经生成了我们想要的so,如下图:
测科,你可能已经注意到,为甚了生成的是libjniSdk-lib.so,没错,android在生成so库时,会自动加上lib,我们引用相关so库的时候只需要调用System.loadLibrary("jniSdk-lib")就可以了。
到此,我们就完成了多个.c,.cpp文件编译成一个so的功能。文章内容比较简单,希望可以对JNI感兴趣的同学带来一点帮助。
代码已上传github,点此获取。