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


    本文目录 

      一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

    天助自助者
  • 相关阅读:
    Sqoop学习笔记_Sqoop的基本使用一
    hive报错( Non-Partition column appears in the partition specification)
    【python-leetcode112-树的深度遍历】路径总和
    谷歌colab运行paddlepaddle之手写数字识别
    谷歌colab上安装百度paddlepaddle框架
    谷歌colab查看cuda的版本
    深度学习数学知识之概率论
    深度学习数学知识之线性代数
    深度学习数学知识之高等数学
    【python-leetcode113-树的深度遍历】路径总和Ⅱ
  • 原文地址:https://www.cnblogs.com/ZeGod/p/9993816.html
Copyright © 2020-2023  润新知