返回

在 Android 项目中交叉编译并导入 NDK SO 库:一步一步指南

Android

导言

本指南将逐步引导您在 Android 项目中交叉编译 NDK(Native Development Kit)SO(共享对象)库并进行导入。我们将在 Linux 和 Mac 环境中分别编译 SO 库。

环境

Linux

  • Red Hat Enterprise Linux 8.6

Mac

  • macOS Mojave 版本 10.14.6

步骤

1. 创建 Android 项目

  • 创建一个新的 Android Studio 项目。
  • build.gradle 文件的 defaultConfig 部分添加以下内容:
externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
}

2. 创建 NDK 目录

  • 在 Android Studio 项目目录中创建一个名为 jni 的目录。
  • jni 目录中创建两个文件:Application.mkAndroid.mk

3. 创建 Application.mk 文件

  • Application.mk 文件中添加以下内容:
APP_ABI := armeabi-v7a armeabi

4. 创建 Android.mk 文件

  • Android.mk 文件中添加以下内容:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

5. 编写 C 代码

  • jni 目录中创建一个名为 hello.c 的文件。
  • hello.c 文件中添加以下 C 代码:
#include <jni.h>
#include <string.h>

JNIEXPORT jstring JNICALL
Java_com_example_nativedemo_NativeLib_stringFromJNI(JNIEnv *env, jobject thiz) {
    return (*env)->NewStringUTF(env, "Hello from JNI!");
}

6. 编译 SO 库

Linux

  • 在终端中导航到项目目录。
  • 运行以下命令:
ndk-build

Mac

  • 在终端中导航到项目目录。
  • 运行以下命令:
ndk-build V=1

7. 将 SO 库导入 Android 项目

  • 在 Android Studio 中,打开 app 模块的 build.gradle 文件。
  • dependencies 部分添加以下内容:
implementation project(':native-lib')

8. 在 Java 代码中使用 SO 库

  • 在 Java 代码中,使用以下代码加载和使用 SO 库:
System.loadLibrary("native-lib");

NativeLib nativeLib = new NativeLib();
String hello = nativeLib.stringFromJNI();
Log.d("MainActivity", hello);

结论

通过按照本指南中的步骤操作,您可以在 Android 项目中成功交叉编译并导入 NDK SO 库。这对于将本机代码集成到 Android 应用程序中非常有用。