从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文件。工程目录大概如下:

Android JNI 多.cpp,.c文件同时打包生成动态链接库

其中native-lib.cpp和CmakeLists.txt为新建工程时自动生成的文件,我们新建了一个MyLinkList.cpp和对应的头文件MylinkList.h。

文件中具体的代码我们暂时不谈,本编文章主要讲如何编写Cmake。

话不多说,直接贴出CmakeLists.txt中的内容

Android JNI 多.cpp,.c文件同时打包生成动态链接库

为了简洁,我将多余的注释都删掉了,上面的注释已经很详细了,相信每一步都能看懂。

到这一步,配置就完成了,此时我们来编译看看是否能生成我们想要的jniSdk-lib.so,

Android JNI 多.cpp,.c文件同时打包生成动态链接库

如上图,点击gradle->assemble,提示编译完成后,确实已经生成了我们想要的so,如下图:

Android JNI 多.cpp,.c文件同时打包生成动态链接库

测科,你可能已经注意到,为甚了生成的是libjniSdk-lib.so,没错,android在生成so库时,会自动加上lib,我们引用相关so库的时候只需要调用System.loadLibrary("jniSdk-lib")就可以了。

到此,我们就完成了多个.c,.cpp文件编译成一个so的功能。文章内容比较简单,希望可以对JNI感兴趣的同学带来一点帮助。

代码已上传github,点此获取

相关文章: