使用android studio的cmakelists.txt方法生成C++的jni静态库在网上查找了很多帖子,基本上都是讲到通过add_library()修改第二个参数将SHARED修改为STATIC就表示将目标文件由动态库改变为静态库。如下,
add_library(native-lib
STATIC
calcul.cpp
)
但是我在上述修改后编译并没有得到目标*.a文件。但是修改为SHARED编译是可以得到动态库目标*.so文件。就是感觉修改为STATIC后参数没起作用。后来看到一位网友说另有一处要修改才成功,现在记录如下。因为android studio中各版本号也很容易困扰开发人员,所以这里我会标出我用的版本。小蜜蜂2021版本
这里尽可能截图下每个过程,就不逐个描述了。
1.创建工程
2.添加CPP文件
在工程路径中新建app/cpp/calcul.cpp文件,这些内容也是网友们提供的实例代码。
#include <jni.h> #include "include/calcul.h" //引用头文件,相当于java中实现接口,头文件为接口,本cpp为实现 int add(int a , int b){ return a + b; }
新建文件件include和文件calcul.h
// // Created by Administrator on 2022/10/15. // #ifndef JNITEST_CALCUL_H #define JNITEST_CALCUL_H int add(int a , int b); #endif //JNITEST_CALCUL_H
CMakeLists.txt文件中添加calcul.cpp。
3.版本同步问题
我的gradle版本是7.2。有些低版本的Gradle Version还需求配置其上方的Android Gradle Plugin Version就是Gradle插件,而7.2可以不用。
开始编译出现JAVA版本过低提示,需要升级到Java 11版本。
如下方式修改调用的java版本。
4.生产动态库*.so
系统默认add_library配置参数是SHARED,所以先生产动态库。可以看到在左侧的工程栏中已经生成了目标文件libmyappication.so文件。根据网友的提示生成动态库基本都没有问题。
5.生成静态库*.a
修改CMakeLists.txt文件。
1、将add_library参数SHARED修改为STATIC。
2、屏蔽掉native_lib.cpp。
只修改上面两点后编译实际没有看到输出目标文件。还要修改build.gradle文件。
在cmake中添加参数targets 'myapplication'。引号中的名称就是我们要输出库的文件名称。
在进行编译后就可以在左侧的工程栏看到对应的静态库输出文件libmyapplication.a