android JNI 开发之—cmake编译so库

本文实现了用cmake编译出so库,本人小白,如有错误,还请各位大佬指出,不胜感激。

效果如下:
android JNI 开发之—cmake编译so库_第1张图片
实验环境:AS:3.3.1(有代码补全功能)

环境配置android JNI 开发之—cmake编译so库_第2张图片

NDK:不管使用ndk-build编还是cmake编,都要勾选
CMake:使用CMake编
LLDB:在AS上调试C代码,勾选

创建工程

选择native c开发(3.3.1),低版本是勾选上include c++ 文件即可,创建完如下
说明:3.3.1创建完自动将CMakeList和c文件都放在cpp文件夹下
android JNI 开发之—cmake编译so库_第3张图片
app下build.gradle
android JNI 开发之—cmake编译so库_第4张图片

 externalNativeBuild {
        cmake {
            path "CMakeLists.txt" // cmake配置文件路径
        }
  }

看到很多人创建完是这样的,这是因为AS默认搜索在src下面搜索的。
如果直接把CMakeLists.txt放在src根目录下,配置就是这样的path “CMakeLists.txt”
如果不在src根目录下,则要声明具体路径path “src/main/cpp/CMakeLists.txt”

运行一下
android JNI 开发之—cmake编译so库_第5张图片

创建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());
}

文件目录如下
android JNI 开发之—cmake编译so库_第6张图片

配置CMakeList.txt

可以看到这里有两个cpp文件,native-lib.cpp和cjni.cpp,这里将使用一个CMakeList.txt进行编译,配置如下
android JNI 开发之—cmake编译so库_第7张图片
注意: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库
android JNI 开发之—cmake编译so库_第8张图片
至此结束

总结

相比ndk-build编,用CMake编真是太省事了,再加上代码补全功能,用起来美滋滋
用ndk-build编参考 android JNI 开发之—ndk-build编译so库

后文

那么生成的so库,怎么让别人使用呢?请参考 android JNI 开发之—导入so库、jar并调用

号外

我另外一个电脑的AS没有代码补全功能,版本是2.3.1,工程创建的没有问题,百度上说的节电模式也没有勾选,但是它打开别人的工程(别人工程有代码补全功能的)又有代码补全功能,但是打开我的工程就是没有代码补全功能,升级一下AS或许能解决这个问题,但是想知道有没有其他解决方法,有大佬知道的话,评论区见,拜托啦~

作者:鸣人的修炼场
出处:https://blog.csdn.net/baidu_33693586

参考教程:
Android笔记之使用CMake进行JNI开发(Android Studio)
NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)

你可能感兴趣的:(Android)