NDK 编译的三种方式

简介: 通过 Android Studio 默认的方式创建带有 native 方法的类,build 项目。

作者:字节流动

来源:https://blog.csdn.net/Kennethdroid/article/details/86418725


通过 Android Studio 默认的方式

创建带有 native 方法的类,build 项目。

image.png

image.png

image.png

image.png

生成与类名相关的 .h 文件。

进入 app -> build -> intermediates -> classes -> debug 目录下

执行: javah com.haohao.hellojni.MyJNI (先配置好 JDK 的环境变量),生成 com_haohao_hellojni_MyJNI.h 文件

image.png

创建 cpp 文件。

在 main 文件夹下,新建 jni 目录,剪切 .h 文件到 jni 目录下,创建 hello.cpp 文件

image.png

hello.cpp

image.png

配置 build.gradle 文件。

修改 app/build.gradle 文件, muduleName 为引入的 .so name , 直接运行项目,安装 apk ,运行就 OK 了

image.png

生成的 .so 文件位置。

image.png

PS: 未指定 CPU 框架时,AS 会生成支持所有 CPU 框架的 .so 文件。

通过 ndk-build

创建 Android.mk 和 Application.mk 文件。

新建一个项目,在 app 目录下(任目录下都可以)新建 jni 文件,添加 Android.mk 和 Application.mk 文件,以及 com_haohao_hellojni_MyJNI.h 文件(运用上一小节的方法生成)。

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 要生成的.so库名称。java代码System.loadLibrary("hello");加载的就是它
LOCAL_MODULE := hello
# C++文件
LOCAL_SRC_FILES := hello.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk

# 不写 APP_ABI 会生成全部支持的平台,目前支持:armeabi arm64-v8a armeabi-v7a
# APP_ABI := armeabi arm64-v8a armeabi-v7a mips mips64 x86 x86_64
APP_ABI := armeabi arm64-v8a armeabi-v7a

生成 .so 文件。

在 jni 目录下(配置好NDK环境变量)直接执行 ndk-build , 生成 .so 文件。

image.png

配置项目工程。

在 main 目录下新建 jniLibs 目录,并拷贝 armeabi arm64-v8a armeabi-v7a 文件夹,运行 proj 。

image.png

image.png

通过 CMake 工具。

从 Android Studio 2.2 开始,就默认使用 CMake 工具构建 NDK 项目,请确保你的 AS 版本大于 2.2 。

通过 IDE 自动构建

创建项目时,勾选 Include C++ support

image.png

选择默认的 Toolchain Default

image.png

AS 自动生成 CMakeLists.txt 文件(CMake 构建脚本)


image.png

image.png

CMakeLists.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library. 
# 指定CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
# 设置模块名为 native-lib,SHARED 可分享的,以及配置源文件的路径
add_library( # Sets the name of the library. 设置模块名
             native-lib
             # Sets the library as a shared library. 
             SHARED 
             # Provides a relative path to your source file(s). 文件路径
             src/main/cpp/native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
# 找到 log 本地模块
find_library( # Sets the name of the path variable. 
              log-lib
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
# 关联 native-lib 模块和 log 模块
target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )


在配置 app/build.gradle ,针对特殊平台 abiFilters 。配置完成之后,同步,运行。

image.png

手动构建

新建一个工程,创建 native 类,快捷键 Alt + Enter ,自动创建 jni 目录和相应的 .cpp 文件。

image.png

native-lib.cpp

#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_haohao_ndk_1cpp_MyJNI_stringFromJNI(JNIEnv *env, jobject instance) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

在工程根目录下创建 CMakeLists.txt 文件。

# 指定CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library. 设置模块名
             native-lib
             # Sets the library as a shared library. 
             SHARED 
             # Provides a relative path to your source file(s). 文件路径
             src/main/cpp/native-lib.cpp )

选择 app modulde ,右击选择Link C++ Project with Gradle。

image.png

选择脚本文件的路径。

image.png

app/build.gradle 会自动同步。同步完成后,运行项目。


image.png


NDK 开发系列文章:


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

阿里云社区.png

相关文章
|
移动开发 JavaScript 前端开发
游戏框架 - 描述Phaser、Three.js等JavaScript游戏框架的核心功能和使用场景。
Phaser是开源2D游戏引擎,适合HTML5游戏,内置物理引擎和强大的图形渲染功能,适用于2D游戏,如消消乐。Three.js是基于WebGL的3D库,用于创建和显示3D图形,支持交互和多种3D效果,广泛应用在游戏、可视化等多个领域。两者各有侧重,选择取决于项目需求和图形交互要求。
1017 3
|
安全 测试技术 Linux
安装配置Samba服务器(CentOS7)
假设我们有这样一个需求 共享名     路径         权限 Mealkey_Share   /smb/docs    所有人员包括来宾均可以访问 Group     /smb/tech    仅允许特定组的用户进行读写访问   特定组的组名为RD,目前的有zyy一人...
5159 0
|
11月前
|
人工智能 图形学
2025年度数字人公司排名推荐:厂商技术实力、优势、定位全方位对比
现在的AI虚拟技术发展越来越普遍,涉足数字人相关内容的公司层出不穷,但质量上参差不齐。对于企业而言,若需专门对接服务商制作数字人视频,技术过硬、经验丰富的公司才是可靠之选——这类公司能精准匹配企业场景需求,输出高质量数字人内容。接下来,为您盘点2025年值得关注的优秀数字人公司。
|
Linux Android开发 iOS开发
JEB Pro v5.32 (macOS, Linux, Windows) - 逆向工程平台
JEB Pro v5.32 (macOS, Linux, Windows) - 逆向工程平台
754 1
JEB Pro v5.32 (macOS, Linux, Windows) - 逆向工程平台
|
机器学习/深度学习 存储 算法
长短时记忆网络(LSTM)在序列数据处理中的优缺点分析
长短时记忆网络(LSTM)在序列数据处理中的优缺点分析
2761 1
长短时记忆网络(LSTM)在序列数据处理中的优缺点分析
|
测试技术
notepad++安装HexEditor插件查看二进制文件
有时候我们需要分析二进制文件,但是分析二进制文件直接用编辑器查看会出现乱码的情况,本文在 notepad++ 软件上安装一个 HexEditor 插件,可方便分析二进制文件。
1998 0
|
存储 Kubernetes 安全
如何与不同节点共享 Docker 容器
【8月更文挑战第27天】
686 5
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
1199 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
手把手教会你使用Markdown【从入门到精通一篇就够了】
手把手教会你使用Markdown【从入门到精通一篇就够了】
使用npm构建vite+vue+ts项目的两种方式
使用npm构建vite+vue+ts项目的两种方式
611 0
使用npm构建vite+vue+ts项目的两种方式

热门文章

最新文章