Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手

简介: 本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。

一、前言

  • JNI 技术,使得Java可以调用C/CPP编写的代码库,也是老技术了,对于不想花时间研究的同学,可以照抄本文的编译模板。
  • JNI代码的AS编译,有两种途径,其一是NDK配置编译,其二是cmake的配置编译,本文采用第二种,也是AS直接支持创建的方式。

二、实现步骤

2.1 创建 cpp目录

  • tv-settings\app\src\main\cpp

2.2 创建jni文件

  1. CMakeList.txt 文件,负责处理编译
  2. 你的 c/cpp 源码文件,本文: JniMotor.c

图示如下:
JNI 模板

2.3 编辑CMakeList.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.

# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)

# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
# 备注:如直接采用AS创建的JNI项目,会将project name作为so库的名字
project("TvSettings")

# 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.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
# 备注:此处罗列你的 c / cpp 文件
add_library(jnimotor SHARED
        # List C/C++ source files with relative paths to this CMakeLists.txt.
        JniMotor.c)

# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
# 备注:此处第一个参数jnimotor,就是生产的库的名字:libjnimotor.so
target_link_libraries(jnimotor
        # List libraries link to the target library
        android
        log)

2.4 编辑 JniMotor.c

  • 以下为C源文件模板
  • 如采用CPP的同学,记得添加extern “C” 标记,因为CPP编译产生的符号与C不同,需要产生C的符号供JAVA调用。
//略……
#include <jni.h>
#include <android/log.h>
#define TAG "JniMonitor"

#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)

//略……


static int motorioctl(int des, int step)
{
   
   
//略……
}

JNIEXPORT jint JNICALL Java_com_android_tv_settings_device_displaysound_aw_1displaysound_JniMotor_ioctl
  (JNIEnv *env, jclass clas, jint des, jint step){
   
   
    int i = des;
    int j = step;
    return motorioctl(i, j);
}

2.5 编辑build.gradle

  • 在 app/build.gradle 的android{} 增加如下配置,指明使用Native build
android {
   
   
 …… 略 ……
    externalNativeBuild {
   
   
        cmake {
   
   
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
 …… 略 ……
}

三、执行编译

  • 如下图所示, 直接产生了个eabi所需的SO文件,大功告成

编译结果:图示一

图示一:SO文件

编译结果:图示二

图示二:查找SO文件路径

相关文章
|
3月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
355 83
|
5月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
850 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
7月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
5月前
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
379 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
|
7月前
|
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开发知识可参考相关书籍。
237 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
7月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
395 0
|
7月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
6月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
222 0
|
10月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
392 6
|
10月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
644 4