返回

AndroidNDK开发——使用Cmake编译生成so文件,构建新世界

Android

使用 Android NDK 编译和加载 C++ 共享库

在 Android 开发中,掌握 Android 原生开发工具包 (NDK) 至关重要。NDK 使开发者能够利用 C 和 C++ 语言编写 Android 应用程序,从而访问底层系统资源并创建高效且功能强大的应用程序。

编译 C++ 代码

NDK 中一个常见任务是使用 CMake 编译 C++ 代码以生成共享对象 (so) 文件。so 文件包含编译后的代码和资源,可以在不同的应用程序中重复使用,简化开发流程并提高代码可维护性。

示例:串口通信

为了演示编译 C++ 代码,我们创建一个简单的示例,该示例使用 C++ 进行串口通信。

#include <jni.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

// Native 方法声明
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_openSerialPort(JNIEnv *env, jobject instance, jstring path);
JNIEXPORT void JNICALL Java_com_example_ndk_MainActivity_closeSerialPort(JNIEnv *env, jobject instance, jint fd);
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_readSerialPort(JNIEnv *env, jobject instance, jint fd, jbyteArray buffer);
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_writeSerialPort(JNIEnv *env, jobject instance, jint fd, jbyteArray buffer);

Makefile

在 C++ 模块的 jni 目录中创建名为 Android.mk 的 Makefile,包含以下指令:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := serial_port.cpp

include $(BUILD_SHARED_LIBRARY)

加载 so 文件

编译 C++ 代码后,我们需要在 Java 代码中加载生成的 so 文件。

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

然后,我们可以使用 so 文件中定义的原生方法。

int fd = MainActivity.openSerialPort("/dev/ttyS0");
if (fd == -1) {
    // 处理错误
}

byte[] buffer = new byte[1024];
int numBytes = MainActivity.readSerialPort(fd, buffer);
if (numBytes > 0) {
    // 处理数据
}

MainActivity.closeSerialPort(fd);

优势

使用 NDK 编译 C++ 代码并加载 so 文件具有以下优势:

  • 高效: C++ 是高效的语言,在需要性能至关重要的任务(如多线程和图形处理)中很有用。
  • 访问系统资源: NDK 允许访问底层系统资源,例如串口、传感器和本机代码。
  • 可重复使用: so 文件可以跨多个应用程序重复使用,从而减少代码冗余并简化维护。
  • 增强可扩展性: NDK 允许将现有 C 或 C++ 代码库集成到 Android 应用程序中,从而提高可扩展性和功能。

常见问题解答

1. NDK 和 JNI 有什么区别?

NDK 是 Android 的原生开发工具包,允许开发者使用 C 和 C++ 语言编写代码。JNI(Java 本地接口)是一种 API,用于在 Java 和本机代码之间建立通信。

2. 如何调试 NDK 代码?

可以通过在 Android Studio 中附加调试器或使用 lldb 命令行工具来调试 NDK 代码。

3. NDK 是否可以用于所有 Android 设备?

NDK 仅适用于具有 ARM 或 x86 架构的 Android 设备。

4. NDK 是否支持多线程?

是,NDK 支持多线程,允许并发执行任务以提高性能。

5. NDK 是否免费使用?

NDK 是免费使用的,作为 Android SDK 的一部分提供。

结论

掌握 NDK 开发技术对于 Android 开发人员至关重要。它使开发者能够编写高效和强大的应用程序,访问底层系统资源并提高代码的可重复使用性。通过遵循本文中概述的步骤,开发者可以充分利用 NDK 的功能并提升其 Android 开发技能。