本文实现了用cmake编译出so库,本人小白,如有错误,还请各位大佬指出,不胜感激。
效果如下:
实验环境:AS:3.3.1(有代码补全功能)
环境配置
NDK:不管使用ndk-build编还是cmake编,都要勾选
CMake:使用CMake编
LLDB:在AS上调试C代码,勾选
创建工程
选择native c开发(3.3.1),低版本是勾选上include c++ 文件即可,创建完如下
说明:3.3.1创建完自动将CMakeList和c文件都放在cpp文件夹下
app下build.gradle
externalNativeBuild {
cmake {
path "CMakeLists.txt" // cmake配置文件路径
}
}
看到很多人创建完是这样的,这是因为AS默认搜索在src下面搜索的。
如果直接把CMakeLists.txt放在src根目录下,配置就是这样的path “CMakeLists.txt”
如果不在src根目录下,则要声明具体路径path “src/main/cpp/CMakeLists.txt”
运行一下
创建jni文件
创建cjni.java文件
package ryd.gyy.cjni;
public class cjni {
//导入libcjni库
static {
System.loadLibrary("cjni");
}
//声明native方法
public native String getStr();
}
创建C文件
在cpp文件下创建cjni.c
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_ryd_gyy_cjni_cjni_getStr(JNIEnv *env, jobject instance) {
// TODO
std::string hello = "CMake编译成功";
return env->NewStringUTF(hello.c_str());
}
文件目录如下
配置CMakeList.txt
可以看到这里有两个cpp文件,native-lib.cpp和cjni.cpp,这里将使用一个CMakeList.txt进行编译,配置如下
注意:add_library和target_link_libraries对应的库名字必须一致,看图中不同颜色的箭头
调用jni
在MainActivity中调用cjni.getStr(),按alt + enter消除错误
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
//调用cjni.getStr()
tv.setText(stringFromJNI() + "\n" + "CMake编译结果:" + cjni.getStr());
}
生成so库
externalNativeBuild {
cmake {
cppFlags ""
}
}
这里没有指定ABI,就是生成所有版本的so库,点击Build——》Make Project,可以在app\build\intermediates\cmake\debug\obj看到so库
至此结束
总结
相比ndk-build编,用CMake编真是太省事了,再加上代码补全功能,用起来美滋滋
用ndk-build编参考 android JNI 开发之—ndk-build编译so库
后文
那么生成的so库,怎么让别人使用呢?请参考 android JNI 开发之—导入so库、jar并调用
号外
我另外一个电脑的AS没有代码补全功能,版本是2.3.1,工程创建的没有问题,百度上说的节电模式也没有勾选,但是它打开别人的工程(别人工程有代码补全功能的)又有代码补全功能,但是打开我的工程就是没有代码补全功能,升级一下AS或许能解决这个问题,但是想知道有没有其他解决方法,有大佬知道的话,评论区见,拜托啦~