Android NDK(二) CMake构建工具进行NDK开发

时间:2022-11-28 08:53:17

本文目录 

  一Androidstudio中需要的插件

  二项目配置

    ①build.gardle配置

    ②CMakeLists.txt

    ③Android和Cpp的代码

    ④so文件生成

    ⑤so文件的位置

一、Android studio中需要的插件:  

  CMake  

  LLDB  

  NDK  

二、项目配置

  Android NDK(二) CMake构建工具进行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