Android ndk cmake 编译so

dsysama

关注

阅读 60

2023-07-16

Android NDK CMake编译SO文件教程

简介

在Android开发中,有时候需要使用C/C++来进行底层开发或者性能优化。NDK(Native Development Kit)提供了一种使用原生代码(C/C++)开发Android应用的方法。而CMake是一个跨平台的构建工具,它可以用简单的语法来描述构建过程,生成与平台无关的构建文件。

本文将教会你如何使用Android NDK和CMake来编译生成SO文件。

整体流程

下面的表格展示了整个流程的步骤:

步骤 描述
1 创建一个Android项目
2 配置NDK和CMake
3 编写C/C++代码
4 编写CMakeLists.txt文件
5 构建项目并生成SO文件
6 使用SO文件

下面将逐步讲解每个步骤需要做什么,以及相应的代码和注释。

步骤1:创建一个Android项目

首先,打开Android Studio并创建一个新的Android项目。选择Empty Activity模板,并按照向导的指引完成项目的创建。

步骤2:配置NDK和CMake

在项目的build.gradle文件中,添加以下代码来配置NDK和CMake的版本和路径:

android {
    defaultConfig {
        // 其它配置
        externalNativeBuild {
            cmake {
                // 设置CMake的版本
                version "3.10.2"
                // 设置CMakeLists.txt文件的路径
                path "CMakeLists.txt"
            }
        }
        ndk {
            // 设置NDK的版本
            version "21.3.6528147"
            // 设置支持的ABI(可根据需要修改)
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
    }
    // 其它配置
}

在完成配置后,点击"Sync Now"按钮同步项目的配置。

步骤3:编写C/C++代码

在项目的app/src/main/cpp目录下,创建一个新的C/C++源文件(例如native-lib.cpp),并编写相关的代码。例如,可以编写一个简单的C++函数来计算两个整数的和:

#include <jni.h>

extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapplication_MainActivity_addNumbers(JNIEnv *env, jobject thiz, jint a, jint b) {
    return a + b;
}

在上面的代码中,我们使用了extern "C"来标识函数为C语言的调用约定,JNIEXPORTJNICALL用于声明函数为JNI函数。

步骤4:编写CMakeLists.txt文件

在项目的根目录下,创建一个名为CMakeLists.txt的文件,并添加以下内容:

cmake_minimum_required(VERSION 3.10.2)
project("native-lib")

# 添加C/C++源文件
add_library(native-lib SHARED native-lib.cpp)

# 查找NDK提供的日志库
find_library(log-lib log)

# 链接日志库到SO文件
target_link_libraries(native-lib ${log-lib})

在上述代码中,我们使用add_library命令来添加C/C++源文件,并使用find_librarytarget_link_libraries命令来链接NDK提供的日志库。

步骤5:构建项目并生成SO文件

点击Android Studio的"Build"按钮来构建项目。构建完成后,可以在以下路径找到生成的SO文件:app/build/intermediates/cmake/debug/obj

步骤6:使用SO文件

要在Java代码中使用生成的SO文件,可以通过以下步骤进行:

  1. app/src/main目录下创建一个名为jniLibs的目录(如果不存在)。

  2. 将生成的SO文件复制到jniLibs目录下的相应ABI目录中(例如jniLibs/armeabi-v7a)。

  3. 在Java代码中使用System.loadLibrary方法来加载SO文件。例如:

    static {
        System.loadLibrary("native-lib");
    }
    

完成上述步骤后,就可以在Java代码中调用我们在C/C

精彩评论(0)

0 0 举报