首页 > 编程语言 >交叉编译c++给android调用

交叉编译c++给android调用

时间:2024-10-10 23:34:38浏览次数:7  
标签:NDK CMAKE 代码 c++ 编译 android ANDROID

NDK及其作用

NDK(Native Development Kit)是一个由 Google 提供的工具集,用于在 Android 平台上开发 C++ 或其他本机代码。NDK 的主要作用是允许开发人员使用 C、C++ 和其他本机语言编写代码,并将其编译为能够在 Android 设备上运行的本机代码(通常是共享库 .so 文件)。

NDK 的主要作用:

  1. 本机代码开发:NDK 允许开发人员使用 C、C++ 或其他本机语言编写 Android 应用的部分或全部代码。这对于需要高性能计算、直接访问硬件功能或跨平台兼容性的应用程序非常有用。

  2. 性能优化:通过使用本机代码,开发人员可以更好地优化应用程序的性能,特别是对于需要执行计算密集型任务或需要更高控制权的应用程序。

  3. 复用现有代码:NDK 允许开发人员将现有的 C、C++ 代码或库集成到 Android 应用中,这样可以更好地复用现有的代码资产。

  4. 访问底层硬件:通过本机代码,开发人员可以更容易地访问设备的底层硬件功能,如相机、传感器等,以及执行更高级别的硬件控制。

  5. 跨平台兼容性:使用 NDK,开发人员可以更轻松地将现有的跨平台 C、C++ 代码移植到 Android 平台,从而实现跨平台兼容性。

  6. 加密和安全性:通过将关键部分的代码编译为本机代码,可以提高应用程序的安全性,因为本机代码更难被逆向工程或篡改。

NDK下载

NDK下载方式有两种:

  1. 通过官网链接下载对应操作系统的NDK
  2. 笔者另一篇博文(AndroidSDK下载(不通过AndroidStudio))提到的通过命令行工具进行下载

下载后目录结构大致如下:

├─build
│  ├─cmake
│  │  └─hooks
│  │      ├─post
│  │      └─pre
│  ├─core
│  │  └─toolchains
│  │      ├─aarch64-linux-android-clang
│  │      ├─arm-linux-androideabi-clang
│  │      ├─riscv64-linux-android-clang
│  │      ├─x86-clang
│  │      └─x86_64-clang
│  ├─gmsl
│  └─tools
├─meta
├─prebuilt
│  └─windows-x86_64
├─python-packages
├─shader-tools
│  └─windows-x86_64
├─simpleperf
├─sources
├─toolchains
│  └─llvm
│      └─prebuilt
│          └─windows-x86_64
└─wrap.sh

交叉编译示例

示例一

opencv编译

  1. 下载opencv源码
  2. 在包含CMakeLists.txt的根目录中新建编译目录build
  3. 打开build目录
  4. 执行cmake命令如下:

    cmake -G"Ninja"
    -DCMAKE_ANDROID_NDK="xxx/android-ndk"
    -DCMAKE_MAKE_PROGRAM="xxx/ninja.exe"
    -DCMAKE_TOOLCHAIN_FILE="xxx/android-ndk/build/cmake/android.toolchain.cmake" -DCMAKE_INSTALL_PREFIX="../install"
    -DCMAKE_SYSTEM_NAME="Android"
    -DANDROID_NATIVE_API_LEVEL="25"
    -DANDROID_PLATFORM="android-25"
    -DCMAKE_ANDROID_ARCH_ABI="arm64-v8a"
    -DCMAKE_ANDROID_STL_TYPE="c++_shared"
    -DBUILD_ANDROID_PROJECTS=OFF ..

  5. 其中关键的配置CMAKE_ANDROID_NDK用于配置ndk所在目录,CMAKE_TOOLCHAIN_FILE用于配置工具链文件,此文件包含了编译过程中所需的工具、库、及平台选项。CMAKE_SYSTEM_NAME告诉cmake编译的操作系统为android, ANDROID_PLATFORM用于指定与Android SDK匹配的版本,ANDROID_NATIVE_API_LEVEL指定 NDK版本的API级别,CMAKE_ANDROID_ARCH_ABI用于指定cpu架构, 最后-G用于指定构建系统, 由于笔者是在Windows 上编译, 所以指定了Ninja, Linux一般指定为Unix Makefiles
  6. 由于笔者选择的构建系统为Ninja, 所以调用Ninja开始编译, 最后通过调用Ninja install进行安装。 与make类似

重要的编译选项为ANDROID_PLATFORMCMAKE_ANDROID_ARCH_ABICMAKE_TOOLCHAIN_FILE

可根据不同的操作系统选择不同的构建系统, 如Linux一般为Unix Makefiles, Windows一般为NinjaVisual Studio

示例二

结合vscode编译一个自己写的so库

代码的部分就省略了, 主要看关键配置CMakePresets.json文件:

{
    "version": 8,
    "configurePresets": [
        {
            "name": "android compile",
            "displayName": "android compile",
            "description": "Sets Ninja generator, build and install directory",
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/out/build/${presetName}",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_ANDROID_NDK": "xxx/android-ndk",
                "CMAKE_MAKE_PROGRAM": "xxx/ninja.exe",
                "ANDROID_ABI": "arm64-v8a",
                "ANDROID_PLATFORM": "android-21",
                "CMAKE_ANDROID_STL_TYPE":"c++_shared",
                "CMAKE_TOOLCHAIN_FILE": "xxx/build/cmake/android.toolchain.cmake",
                "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
            }
        }
    ]
}

然后编辑自己的CMakeLists.txt文件, 与本机编译(对应交叉编译)没什么不同。

通过CMakePresets.json达到了示例一相同的效果, 只是方式不一样。 编译选项都是一样的。

标签:NDK,CMAKE,代码,c++,编译,android,ANDROID
From: https://www.cnblogs.com/quenwaz/p/18457453

相关文章

  • 继承--C++
    文章目录一、继承的概念及定义1、继承的概念二、继承定义1、定义格式2、继承基类成员访问方式的变化3、继承类模板三、基类和派生类间的转换1、继承中的作用域2、隐藏规则:四、派生类的默认成员函数1、4个常见默认成员函数2、实现⼀个不能被继承的类五、继承与友元六......
  • 实验1 现代c++编程初体验
    实验1:1//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>9#include......
  • AndroidSDK下载(不通过AndroidStudio)
    下载命令行工具在androiddeveloper滚动到Commandlinetoolsonly下载对应操作系统的命令行工具。笔者下载了windows版本的,其目录结构如下:└─cmdline-tools├─bin│apkanalyzer.bat│avdmanager.bat│lint.bat│profgen......
  • visual studio原生支持C++的含义
    “原生支持C++”指的是一个开发工具(如IDE、操作系统、库等)直接且全面地支持C++编程语言,无需额外的配置或外部插件。这意味着开发工具能够原生处理C++代码的编写、编译、调试、运行等工作,通常包括以下几个方面:编译器支持:工具自带或能够直接集成C++编译器(如MicrosoftVisualC+......
  • 实验1 现代C++编程初体验
    1.实验任务1task1源代码:1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78//声明9//模板函数声明10template<typenameT>//*****表明这是一个模板参数,可以接受任意类型的参数......
  • C++入门——类和对象(下)
    文章目录一、再探构造函数二、类型转换三、static成员四、友元五、内部类六、匿名对象总结一、再探构造函数不了解构造函数的小伙伴可以先看这篇文章构造函数1.之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列......
  • C++——模拟实现list
    1.初步实现结点和链表namespacejxy{ template<classT> structlist_node { T_data; list_node<T>*_prev; list_node<T>*_next; list_node(constT&x=T()) :_data(x) ,_prev(nullptr) ,_next(nullptr) {} }; template<cla......
  • C++——stack和queue
    1.简介栈和队列的定义和之前的容器有所差别2.简单地使用voidtest_stack1(){ stack<int>st; st.push(1); st.push(2); st.push(3); st.push(4); while(!st.empty()) { cout<<st.top()<<""; st.pop(); } cout<<endl;}voidtest_queu......
  • android11 开机动画黑屏优化(总结)
    一、开机向导引起的短暂黑屏在系统中默认是有开机向导的,首次开机会首选进入开机向导,然后进入锁屏桌面,如果某些原因引起开机向导卡顿,会造成短暂黑屏。可以修改如下:frameworks/base/packages/SettingsProvider/res/values/defaults.xmltruetrue再在产品mk中去掉这两个app:pac......
  • Boost C++ 库 | 智能指针(共享指针、共享数组、弱指针、介入式指针、指针容器)入门
    点击上方"蓝字"关注我们01、共享指针>>>这是使用率最高的智能指针,但是C++标准的第一版中缺少这种指针。它已经作为技术报告1(TR1)的一部分被添加到标准里了。如果开发环境支持的话,可以使用 memory 中定义的 std::shared_ptr。在BoostC++库里,这个智能指针命名为......