Android NDK开发CMake构建工具使用

Posted zegod

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK开发CMake构建工具使用相关的知识,希望对你有一定的参考价值。

本文目录 

  一androidstudio中需要的插件

  二项目配置

    ①build.gardle配置

    ②CMakeLists.txt

    ③Android和Cpp的代码

    ④so文件生成

    ⑤so文件的位置

一、Android studio中需要的插件:  

  CMake  

  LLDB  

  NDK  

二、项目配置

  技术分享图片

  ①build.gardle的配置  

  多了两个externalNativeBuild :defaultConfig下的、和defaultConfig 并行下的externalNativeBuild

   a、defaultConfig下的externalNativeBuild

 defaultConfig {
        ...
        externalNativeBuild {
                cmake {
                    cppFlags ""
//cppFlags "-fexceptions -frtti"   ,在AndroidStudio新建项目->选择C++版本时,勾选?Exceptions Support和?Runtime Type Information Support时会有,
                }
        }
  }

    注:   

    Exceptions Support:支持C++异常处理   

    Runtime Type Information Support:支持运行时类型识别, 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型  

  b、和defaultConfig 并行下的externalNativeBuild ,用于指定CMakeLists.txt的路径    

externalNativeBuild {
    cmake {
       path "CMakeLists.txt"
       }
}

  ②CMake的构建脚本

# 设置Cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

# 编译library
add_library( # 设置library名称
     native-lib

     # 设置library模式,SHARED模式会编译so文件,STATIC模式不会编译
     SHARED

     # 设置原生代码路径
     src/main/cpp/native-lib.cpp )

# 定位library
find_library( # library名称
    log-lib

    # 将library路径存储为一个变量,可以在其他地方用这个变量引用NDK库
    # 在这里设置变量名称
    log )
# 关联library target_link_libraries( # 关联的library
native-lib # 关联native-lib和log-lib ${log-lib} )

  ③Cpp代码和Android代码调用

   Cpp代码:  

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_yl_ndkdemo_MainActivity_stringFromJNI(
     JNIEnv *env,
    jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

  Android代码:  

public class MainActivity extends AppCompatActivity {

     // 加载native-lib,不加lib前缀
    static {
     System.loadLibrary("native-lib");
     }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
    
    // 将获取的字符串显示在TextView上
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    }
    /**
     * native-lib中的原生方法
     */
    public native String stringFromJNI();
} 

  ④so文件的生成  

  在CMakeLists.txt中将library的编译模式设置为SHARED模式,点击AS的编译按钮,在app > build > intermediates > cmake > debug > obj目录下会生成不同CPU架构对应的so文件  

  不同架构的指定:

defaultConfig {
    ...       
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64"
    }
}

  ⑤so文件的位置  

   在项目的app > src > main目录下创建jniLibs文件夹,将生成的so文件(带着CPU架构目录)拷贝到jniLibs文件夹中

 

 

参考:https://blog.csdn.net/kong_gu_you_lan/article/details/79091789


以上是关于Android NDK开发CMake构建工具使用的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事

Android NDK——必知必会之Android Studio使用CMake构建NDK项目的背后的故事

使用 cmake 构建工具链以针对 android 进行交叉编译

Android NDK JNI开发(工具:CMake)

Android NDK 开发CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )

Android NDK 开发CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )