android NDK相关,调用C库,JNI,交叉编译,跨平台

首先就是库给我,我先进行开发(按照文档),最后进行交叉编译ARM平台。

遇到的问题:我要看到代码效果,所以必须要在真机上跑代码,那么我调用的库就必须是我这个平台适用的,有两种方式:方式1:先编译成我真机架构需要的so库,然后引入项目。方式2:源码给我,我在android项目中交叉编译成我需要的库,然后进行引用。

.c 文件:通常是指C语言源代码文件,用于编写C语言程序。这些文件包含C语言的源代码,并且通常需要通过编译器(如gcc)来将其编译成可执行程序或库文件。

.cpp 文件:通常是指C++语言源代码文件,用于编写C++程序。C++是C语言的扩展,因此C++源代码文件可以包含C语言代码,并且还支持C++独有的特性和语法。

.h 文件:通常是指头文件(Header File),用于声明函数、类、变量和常量等。头文件通常包含了程序接口的定义,供其他源代码文件引用。在C和C++中,头文件通常以.h为扩展名。

.dll 文件:通常是指动态链接库(Dynamic Link Library),用于在Windows系统中共享可执行代码和数据。动态链接库包含了一组函数、变量或资源,可以被程序动态加载并调用。它们允许多个程序共享相同的代码和资源,从而节省内存和磁盘空间。(可执行代码和数据共享库)

".so" 是指在Linux系统下的共享对象文件,它是一种动态库的实现方式。在Linux系统下,动态库通常被称为共享对象(shared object)。".so" 文件包含可执行代码和数据,可以在程序运行时被动态加载和链接,从而节省内存和磁盘空间。

".a" 是指静态库文件(archive file),它是另一种代码和数据的共享库,用于在编译时进行静态链接。静态库通常包含多个目标文件的归档文件,可以通过编译器的选项来链接到目标程序中。

与动态库不同,静态库在编译时被链接到目标程序中,从而使得程序的独立性更强,不需要依赖外部库。但是,静态库的缺点是会增加目标程序的大小,并且不支持动态更新和动态链接。

因此,总的来说,".so" 文件是一种动态库的实现方式,可以在程序运行时进行动态链接,而 ".a" 文件是一种静态库的实现方式,需要在编译时进行静态链接。两者各有优缺点,具体应用需要根据实际情况来选择。

-----

在 Linux 系统中,将 C 程序编译成共享库(.so 文件)通常需要使用以下工具:

GCC 编译器:

GCC 是 Linux 系统上常用的 C 语言编译器,也是编译生成共享库的主要工具之一。确保你的系统中已经安装了 GCC 编译器。

GNU Make 工具:

GNU Make 是一个用于自动构建和编译项目的工具,通常与 Makefile 文件一起使用。Makefile 文件包含了编译共享库所需的编译规则、依赖关系和命令。通过编写适当的 Makefile 文件,可以方便地使用 GNU Make 来进行编译。

共享库的链接选项:

在使用 GCC 编译器时,你需要使用特定的选项来生成共享库。例如,使用 -shared 选项告诉编译器生成共享库,使用 -fPIC 选项确保生成位置无关的代码。

下面是一个简单的示例,演示如何使用 GCC 将 C 程序编译成共享库:

假设你有一个名为 example.c 的 C 源文件,你可以使用以下命令将其编译成共享库 libexample.so:

gcc -shared -fPIC -o libexample.so example.c

上述命令中,-shared 选项指示 GCC 生成共享库,-fPIC 选项表示生成位置无关的代码(Position Independent Code),-o 选项指定输出文件名。

请注意,实际情况可能更复杂,特别是对于涉及多个源文件、依赖库等情况的项目。针对较大的项目,通常会使用 Makefile 来管理编译过程,以确保便捷和可维护性。

那么在linux中编译的c程序库可以直接在android中使用吗?

在一些情况下,可以将在 Linux 中编译的 C 程序库(.so 文件)直接在 Android 中使用,但并不是绝对适用。以下是需要考虑的一些因素:

架构兼容性:Linux 和 Android 使用不同的体系结构和指令集(如 x86、ARM),因此,在将 Linux 上的程序库用于 Android 之前,需要确保两者的架构兼容。如果程序库是针对目标 Android 设备的架构编译的,例如 ARM 架构的设备,则可以直接使用。

依赖关系:程序库可能依赖于其他的库或系统功能。在将程序库移植到 Android 环境时,必须确保其所依赖的库和功能在 Android 平台上是可用的。

Android NDK:Android 使用 Android NDK(Native Development Kit)来支持本地代码开发。在将 Linux 的程序库用于 Android 时,需要使用 Android NDK 提供的工具链和构建系统进行编译和集成。这意味着需要进行适当的配置和调整,以便正确地构建和链接程序库。

权限和安全性:在 Android 平台上,应用程序有严格的权限和安全性限制。因此,使用外部的程序库时,需要确保应用程序具有访问和使用该程序库的权限。

总之,尽管在某些情况下可以将在 Linux 中编译的 C 程序库直接用于 Android,但在进行移植时需要考虑架构兼容性、依赖关系、使用 Android NDK 进行编译和配置等因素。最佳实践是根据目标平台的要求重新编译和集成程序库,以确保在 Android 上的正确性和可靠性。

-----

假如要把c语言库集成到android程序,要使用NDK:

NDK(Native Development Kit)是一个允许开发者在 Android 平台上使用 C、C++ 和其他本地语言编写代码的工具集。它提供了一组工具和库,使开发者能够编写使用本地代码的 Android 应用程序,例如游戏引擎、图形渲染程序等。

使用 NDK,开发者可以将部分应用程序逻辑使用 C 或 C++ 等本地语言编写,以获得更高的性能、更好的硬件控制和更好的跨平台移植性。NDK 提供了一组工具链、库和文件,使开发者能够将本地代码编译为适用于 Android 设备的可执行文件,并集成到他们的 Android 应用程序中。

需要注意的是,使用 NDK 开发应用程序可能会增加开发难度和复杂性,因此在大多数情况下,Google 建议开发者尽量使用 Java 或 Kotlin 等高级语言进行 Android 应用程序开发。只有在确实需要使用本地代码来实现特定的性能优化或功能扩展时,才建议使用 NDK 进行开发。

NDK(Native Development Kit)是一个用于开发 Android 应用中本地代码(如 C、C++)的工具集合。它提供了一系列的工具和库,使开发者能够在 Android 应用中编写原生代码,并在应用中调用这些原生代码。

NDK 的主要目标是提供性能优化和底层功能访问的能力。通过使用 NDK,开发者可以将 CPU 密集型任务、图形渲染、音频处理等关键性能部分使用 C 或 C++ 来编写,以提高应用的执行效率和速度。此外,NDK 还提供了许多底层系统函数和硬件接口的访问能力,使开发者可以直接与底层系统交互,实现更高级别的控制和功能。

NDK 主要包含以下几个方面的内容:

工具链:NDK 提供了一套用于编译、构建和调试本地代码的工具链。其中包括 GCC 或 Clang 编译器、LLVM 链接器以及其他辅助工具。

预构建库:NDK 包含了一些常用的预构建库,例如 OpenSL ES(用于音频)、OpenGL ES(用于图形渲染)等。开发者可以直接使用这些库来加快开发进程。

头文件和库文件:NDK 包含了 Android 平台的头文件和库文件,使开发者能够访问 Android 系统的底层功能和接口。

支持模块:NDK 提供了一些用于处理常见任务的支持模块,例如图像处理、音频处理等。开发者可以使用这些模块来简化开发过程。

需要注意的是,尽管 NDK 提供了一些优势,但在应用开发过程中,推荐优先考虑使用 Java 或 Kotlin 进行开发。只有在需要使用底层功能、对性能要求较高或需要重用现有的 C/C++ 代码时,才需要考虑使用 NDK 编写本地代码。

什么是预构建库呢?可以理解为本平台上已经编译好的库文件,你可以直接拿来用的,不用自己写c并编译引用。详细介绍:

预构建库(Prebuilt Libraries)是指已经编译好的库文件,通常以二进制形式发布。在 Android 应用程序开发中,开发者可以使用预构建库来加速应用程序开发,减少编译时间和调试难度。

Android 应用程序通常需要依赖许多库文件,如第三方库、系统库等。这些库文件可能由不同的供应商提供,也可能需要在不同的平台上进行编译。为了简化应用程序构建流程和减少构建时间,开发者可以选择使用预构建库,而不是从源代码编译所有依赖项。

使用预构建库的好处包括:

  1. 降低构建时间和成本:预构建库已经编译好了,无需再花费时间和资源进行编译。
  2. 减少构建错误:使用预构建库可以避免由编译器或编译环境造成的构建错误。
  3. 更容易集成:使用预构建库可以更轻松地集成第三方库或系统库,而不必关心底层实现细节。

此处让我想到了c语言不跨平台的缺点,开发完程序想在所有的计算机上运行?做不到啊,怎么办?需要开发者在不同的操作系统下进行开发,然后编译呗,具体不太了解(不同平台用同一套源码都可以进行编译吗?还是说要更改源码以适应不同平台。)

解答:还真是需要修改源码以适应不同平台

       一般来说,用 C 语言在 Windows 系统开发的程序,不能直接在 Linux 系统下编译运行,需要进行相应的修改和适配。

       原因在于,Windows 和 Linux 系统的底层实现和 API 接口有很大的差异。例如,在 Windows 中,文件路径是以反斜杠 \ 分隔的,而在 Linux 中,则是以正斜杠 / 分隔的。这意味着在 C 代码中使用文件路径时,需要根据不同的系统进行适配。

       此外,在 Windows 和 Linux 系统下,C 标准库和系统库的实现也有所不同,有些函数在 Windows 和 Linux 下的行为和接口定义也不完全一样。例如,在 Windows 下,Sleep() 函数可以暂停当前线程的执行,但在 Linux 下没有这个函数,需要使用 usleep() 函数替代。

因此,如果您想要将 Windows 下的 C 代码迁移到 Linux 平台上运行,需要进行相应的修改和适配,以确保代码在不同的平台上能够正确编译和运行。通常可以通过使用跨平台的库或框架,如 Qt、GTK+、Boost 等,来简化跨平台开发的工作。

当然,也可以通过交叉编译:

交叉编译是指在一种操作系统上开发和构建应用程序,但将其编译成在不同体系结构或操作系统上运行的可执行文件。对于 Windows 到 Linux 的交叉编译,您需要使用相应的交叉工具链。

以下是一个典型的交叉编译过程:

       安装交叉编译工具链:您需要安装适用于 Linux 平台的交叉编译工具链,并确保工具链包含了目标平台所需的头文件和库文件。

       配置编译环境:设置环境变量,以便编译器和链接器能够正确地找到交叉编译工具链。

修改代码:在某些情况下,您可能需要对代码进行一些修改,以解决不同操作系统之间的差异。这可能涉及文件路径分隔符、系统调用接口、库函数等方面的改动。

       使用交叉编译工具链进行编译:通过指定适当的编译器和选项,使用交叉编译工具链编译源代码。例如,对于 GCC 工具链,可以使用类似 gcc -o output_file input_file.c 的命令进行编译。

       将可执行文件拷贝到 Linux 系统:将生成的可执行文件从 Windows 系统复制到 Linux 系统,并确保在 Linux 上具备执行权限。

请注意,在进行交叉编译时,需要确保目标平台的兼容性,并根据目标平台的要求进行相应的配置和修改。此外,某些功能或库可能在不同的操作系统上并不完全相同,因此可能需要额外的适配工作。

总结来说,通过交叉编译,您可以将原本在 Windows 系统下开发的 C 程序转换为可在 Linux 系统上运行的程序,但仍然需要进行一些修改和适配工作。

当开发(windows环境)android程序时,进行编译运行时(真机),android studio会自动进行架构识别和自动化交叉编译。而这个过程我们感受不到,太底层了。当然喽,假如你开发android程序,然后想看看效果,还得自己了解手机CPU架构,然后交叉编译成目标平台可用的程序,然后还得adb自己连接设备,自己安装程序,自己运行的话,那么可就太复杂了,开发个der啊还,兴趣早就磨没了,开发效率也低,也许搞个hello,world出来我得花费几个月,知识掌握的是挺多,但是属实没体验感,没效率。

思想总结:

开发c程序等,根据需求,库,文档进行业务逻辑开发即可,不同平台的话交叉编译就行了。(比如我在windows系统下开发的,把源码交叉编译成linux系统可以运行的程序即可)

开发java程序时,就不需要了,这一任务交给虚拟机完成了,也即开发编译后在任何平台下的jvm都可以执行。(不依赖特定操作系统)

开发android程序呢,android studio直接给你交叉编译,你就专注于业务逻辑就好了。当你需要底层的c++程序怎么办呢?那就需要编译出android需要的动态库,然后通过JNI进行调用就好啦。

所以,作为开发者开发时只需要开发环境(一些编辑器,库,包)。(根据需求,文档进行业务逻辑开发),然后编译成相应平台能运行的程序。

在 Android 中,编译出可用的动态库主要有以下几种方式:

  1. 使用 Android NDK 进行编译:Android NDK 是 Android 提供的一个开发工具包,它可以让你在本地开发 C/C++ 应用程序并编译出动态库。你可以使用 NDK 提供的工具链和构建系统,使用 CMake 或 ndk-build 工具来编译出动态库。这种方式是最常见的方式,也是推荐的方式。
  1. 使用第三方工具进行编译:除了 Android NDK 之外,还有一些第三方工具可以帮助你将 C/C++ 代码编译成 Android 可用的动态库,例如 Crystax NDK 和 Intel C++ Compiler for Android 等。这些工具通常提供更好的性能和更高的兼容性,但可能需要付费或配置复杂。
  1. 使用交叉编译工具进行编译:你可以使用一些交叉编译工具,例如 CodeSourcery、Arm Linux GCC 等,将 C/C++ 代码编译为 Android 可用的动态库。但这种方式需要手动配置编译环境和工具链,相对较为复杂。    注意:那么在哪种系统环境下进行交叉编译呢?(理论上来说可以在 Linux 或 Windows 等操作系统环境下进行。不过,由于交叉编译工具链本身是针对特定操作系统环境编译的,因此需要选择对应操作系统的工具链才能进行交叉编译。

       通常情况下,Linux 环境下更为常见和推荐,因为许多开源库和工具都是在 Linux 平台下开发和测试的,可以更好地保证兼容性和稳定性。在 Linux 环境下,你可以轻松地安装和配置交叉编译工具链,执行相关命令和脚本,以及处理生成的动态库文件。

       当然,在 Windows 环境下也是可行的,你可以使用类似 Cygwin、MinGW 或 WSL 等工具模拟 Linux 环境,或者直接使用 Windows 版本的交叉编译工具链。不过相对来说会稍微复杂一些,需要处理一些兼容性和路径等问题。因此,建议选择在 Linux 环境下进行交叉编译,这样可以更加方便和稳定。如果必须在 Windows 环境下进行,则需要更加仔细和耐心地处理相关问题。)

  1. 使用现有的 Linux 动态库:在某些情况下,你可以直接使用已经存在的 Linux 动态库,只需要在代码中调用 System.loadLibrary() 方法加载即可。但是,需要注意的是,Linux 和 Android 的系统环境和库有所不同,因此需要进行适当的修改和配置,以便正确地使用。

总之,使用 Android NDK 进行编译是最常见和推荐的方式,它提供了一整套工具链和构建系统,可以轻松地将 C/C++ 代码编译成 Android 可用的动态库。如果需要更高的性能和兼容性,可以尝试使用第三方工具或交叉编译工具。而直接使用现有的 Linux 动态库,则需要考虑环境和库的差异,需要进行适当的修改和配置。

思考:那么也就是说要么在linux环境通过交叉编译工具链进行交叉编译,要么在windows环境下模拟Linux环境进行交叉编译(不推荐),要么在windows环境下使用 Windows 版本的交叉编译工具链(更不推荐)。        要么就用android NDK进行编译!!!。

接下来的问题:1.怎么使用android NDK编译动态库?步骤是什么?

配置 Android Studio:首先需要在 Android Studio 中启用 NDK 支持,在项目的 build.gradle 文件中添加以下内容:

android {

    //...

    defaultConfig {

        // ...

        externalNativeBuild {

            cmake {

                //指定 CMakeLists.txt 路径

                path "CMakeLists.txt"

            }

        }

    }

    //...

}

编写适配的 CMakeLists.txt 文件:创建一个用于编译动态库的合适的 CMakeLists.txt 文件,确保在构建过程中使用了正确的交叉编译工具链和相关编译参数。在 CMakeLists.txt 文件中指定目标平台和架构等信息。

进行编译:在 Android Studio 中调用 CMake 工具进行编译,生成动态库文件。可以使用 Android Studio 提供的 NDK Build 工具或 CMake 工具进行编译。

将动态库集成到 Android 项目中:将生成的动态库文件拷贝到 Android 项目的合适位置,并在 Android 项目的构建配置中引入这个动态库。

测试和部署:最后,可以对动态库进行测试和进一步部署,以确保它能够在 Android 平台上正常工作。

2.假如使用linux交叉编译工具链,编译好之后,又该怎么使用?

将动态库集成到 Android 项目中:将生成的动态库文件拷贝到 Android 项目的合适位置,并在 Android 项目的构建配置中引入这个动态库。可以使用 Android Studio 或其他构建工具进行相关配置。

测试和部署:最后,可以对动态库进行测试和进一步部署,以确保它能够在 Android 平台上正常工作。

先从最基本的开始吧:创建一个android NDK项目

要打开和使用 Android NDK 项目,你需要做一些准备工作,包括以下步骤:

安装 Android Studio:确保你已经在计算机上安装了最新版本的 Android Studio。Android Studio 是 Google 提供的官方集成开发环境(IDE),用于开发 Android 应用程序和本地代码(包括使用 NDK 构建的代码)。

安装 NDK 和 C/C++ 工具链:在 Android Studio 中使用 NDK 开发需要安装 NDK 和相关的 C/C++ 工具链。可以通过 Android Studio 的 SDK Manager 来安装 NDK。打开 Android Studio,点击 "Tools" > "SDK Manager",然后在 "SDK Tools" 选项卡中选择 "Android NDK" 并点击 "Apply" 或 "OK" 安装。

配置 Gradle 构建文件:在你的 Android 项目中,需要根据项目的需求配置 Gradle 构建文件(build.gradle)。这包括指定 NDK 目标平台和 ABI,以及配置 CMake 或 ndk-build 的参数。

准备本地代码和构建脚本:如果你的项目包含本地代码(C/C++),需要准备相应的源文件、CMakeLists.txt 或 Android.mk 文件等。根据项目的需要,选择合适的构建脚本(如 CMake 或 ndk-build)来描述本地代码的构建规则。

熟悉 NDK 开发相关知识:如果你是初次使用 NDK 进行开发,建议先熟悉 NDK 开发的基本知识和工作流程。这包括理解如何编写 JNI 接口、配置 CMakeLists.txt 或 Android.mk 文件,以及进行本地代码的调试和测试等。

一旦你完成了上述准备工作,就可以在 Android Studio 中打开和运行 Android NDK 项目了。通过正确配置项目的构建文件和相关参数,你可以利用 Android Studio 提供的工具链和功能来进行本地代码的编译、调试和运行。

依据ffmpeg的步骤来学习步骤:

FFmpeg官网:

Download FFmpeg

该网站中的FFMPEG分为3个版本:Static,Shared,Dev。

前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。

Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。

Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

windows,linux下安装ffmpeg很简单,使用命令行也简单。(static版本)C/C++编程:linux上安装ffmpeg_OceanStar的学习笔记的博客-CSDN博客

windows平台下开发C程序集成ffmpeg:

QT+FFMPEG实现视频播放 - 平凡的编程者 - 博客园 (cnblogs.com)(dev+shared版本 )

  1. 开发java程序集成ffmpeg:

方式1:引入封装了ffmpeg的库

方式2使用 Java 的外部库调用机制

方式3:使用命令行调用

Java使用ffmpeg进行视频格式转换、音视频合并、播放、截图_java+ffmpeg实现图片合并,并预播放_西凉的悲伤的博客-CSDN博客

       有一些第三方 Java 封装库提供了对 FFmpeg 功能的封装,以便在 Java 项目中更方便地使用。例如,Xuggler(已停止维护)、JAVEJavaCV 等库都提供了对 FFmpeg 的封装,你可以通过添加这些库依赖并按照其文档使用相应的 API 来调用 FFmpeg 功能。

       Java 提供了对外部库的调用支持,你可以使用 Java Native Interface (JNI) Java Native Access (JNA) 等机制来调用 C 语言编写的 FFmpeg 库。这种方式需要编写 JNI JNA 的代码来实现 Java C 语言之间的交互,将 FFmpeg 的功能封装成 Java 接口供你的项目使用。

       如果你只需要简单地执行 FFmpeg 的命令行命令,你可以使用 Java ProcessBuilder 类或 Runtime.exec() 方法来执行 FFmpeg 命令并处理其输出。这种方式可以通过在 Java 代码中构建和执行命令行命令来实现 FFmpeg 的功能。

总结也就是:

  1. java库(别人封装好的)
  2. jni(自己做)

##########

编译ffmpeg so库:

https://juejin.cn/post/6844904039524597773

有一个问题啊,假如我并不知道我的程序要在什么架构上的android设备运行呢?我怎么生成动态库呢?猜测:把各种架构的都给生成一套。到时候自动选择(应该会自动吧,不太清楚)

https://zhuanlan.zhihu.com/p/356709766

思考:在windows系统下开发java程序调用c语言库,还好,不是很繁琐,应该没有交叉编译那么繁琐,不过jni的编写还是很复杂滴。

Android平台开发程序集成ffmpeg:

思考:android中调用c/c++,那么就是靠JNI了,首先就需要将c程序编译成自己系统可以用的动态库(要会把源码编译成so文件。)然后进行封装,调用(用JNI)。

基本步骤:

编写 C++ 函数:

首先,你需要编写一个或多个 C++ 函数,并将其编译为动态链接库(DLL)或共享对象(SO)文件。这些函数应该接受特定的参数,并返回特定类型的结果。

你需要编写一层 C/C++ 封装代码,用于调用 FFmpeg 的相关函数。这些封装函数可以根据需要提供给 Java 使用的特定功能,例如音视频编码、解码、转码等。

编写 JNI 接口代码:

接下来,你需要编写 JNI 接口代码,将 C++ 函数与 Java 代码连接起来。JNI 接口代码应声明一个与 C++ 函数签名相匹配的 Java 方法,然后将 Java 参数转换为 C++ 参数,并调用 C++ 函数。最后,将 C++ 函数的返回值转换为 Java 类型并返回给 Java 调用方。

编译 JNI 接口代码:

将 JNI 接口代码编译为动态链接库或共享对象文件,并确保其与 C++ 函数编译的动态链接库或共享对象文件链接在一起。

在 Java 中加载 JNI 库

在 Java 代码中,使用 System.loadLibrary() 方法加载 JNI 库,并调用其中的方法。Java 调用的方法名称和参数类型必须与 JNI 接口代码中声明的方法名称和参数类型匹配。

编译与调用:

Android studio项目调用SO库_androidstudio 调用so-CSDN博客

(https://blog.csdn.net/lanfengyong/article/details/106261300)

Android调用C/C++库_android 跟c++之间相互调用-CSDN博客

(Android调用C/C++库_android 跟c++之间相互调用-CSDN博客)

建项目,配置,编译。其他项目进行引入。

)用到了NDK,cmake,cMakeList.txt(高级封装,更自动化)

其他方式编译:

)Makefile+GNU Make+GCC/clang(更繁琐)

Android NDK开发(一)——ndk-build编译生成so库文件并使用_android ndk编译-CSDN博客 (https://blog.csdn.net/zoujin6649/article/details/90108037)

)Ndkbuild(渐少)

Android FFmpeg 编译和集成(十四)-腾讯云开发者社区-腾讯云 (tencent.com)(一般看懂)

不过根据文章所做,似乎是可以通过linux系统进行编译的,最后在项目中进行引用。

Linux交叉编译,建项目,引入,jni。(好麻烦,好难啊)

创建NDK项目:

Android Studio 4.0.+NDK项目开发详细教学_android studio ndk开发-CSDN博客

(https://blog.csdn.net/luo_boke/article/details/107306531)

android NDK(一): 集成本地代码(c/c++)到安卓工程并调用_c转android ndk-CSDN博客

makeFile介绍与使用:

C++库封装JNI接口:

C++库封装JNI接口——实现java调用c++ - Lee-zq - 博客园 (cnblogs.com)

写构建文件时可以详细读一下,太详细了!

Makefile教程(绝对经典,所有问题看这一篇足够了)-CSDN博客

扩展:android开发文档看看,也有用处:

向您的项目添加 C 和 C++ 代码  |  Android Studio  |  Android Developers (google.cn)

(https://developer.android.google.cn/studio/projects/add-native-code?hl=zh-cn#new-project)

在Android中,您可以通过以下几种方式将C++库集成到您的应用程序中:

       静态库(Static Library):

将C++库编译为静态库文件(.a文件)。

将静态库文件复制到您的Android项目中的jniLibs目录下。

在您的Android.mk或CMakeLists.txt文件中添加相应的库引用。

在您的Java代码中使用JNI(Java Native Interface)来调用C++库。

       共享库(Shared Library):

将C++库编译为共享库文件(.so文件)。

将共享库文件复制到您的Android项目中的jniLibs目录下。

在您的Android.mk或CMakeLists.txt文件中添加相应的库引用。

在您的Java代码中使用JNI来加载和调用C++库。

       AAR(Android Archive)包:

将C++库打包为AAR文件,其中包含了C++库的二进制文件、资源文件和元数据。

将AAR文件复制到您的Android项目中的libs目录下。

在您的build.gradle文件中添加AAR文件的依赖。

在您的Java代码中使用JNI来加载和调用C++库。

       Gradle ndk-build插件:??不清楚

使用ndk-build工具编译C++源代码,并将其生成的库文件复制到您的Android项目中的jniLibs目录下。

在您的build.gradle文件中配置ndk-build插件,指定C++源代码的位置和编译选项。

在您的Java代码中使用JNI来加载和调用C++库。

原生代码(Native Code)是指使用底层编程语言(如C、C++、汇编语言等)编写的与特定平台或硬件相关的代码。原生代码直接在计算机的硬件上执行,而不需要通过中间层(如虚拟机或解释器)进行转译或解释。这种直接执行的优势使得原生代码在性能、资源利用和底层功能访问方面具有一定的优势。

相对而言,高级编程语言(如Java、Python)编写的代码被称为非原生代码。这些高级语言的代码需要通过解释器或虚拟机(例如Java虚拟机)将其转换为底层机器码,然后再由计算机硬件执行。尽管高级语言编写的代码相对易于开发和维护,但其执行效率可能较低。

原生代码通常用于对性能和资源消耗要求较高的应用场景,例如图形渲染、游戏开发、计算密集型任务等。由于原生代码直接操作底层硬件,可以更好地控制和优化代码执行,从而实现更高的性能和更低的延迟。

在 Android 平台上,使用 Android NDK 可以编写原生代码,并将其与 Java 代码混合使用。这样一方面可以充分利用底层硬件资源,另一方面可以兼顾开发效率和代码可维护性。

ndk-build是Android NDK(Native Development Kit)中提供的一个构建工具,用于构建和编译使用C/C++语言编写的原生代码(native code)。Android NDK允许开发人员在Android应用中使用C/C++来编写部分代码,通常用于对性能要求较高或需要直接访问底层系统功能的部分。ndk-build工具可以将这些C/C++代码编译成适用于Android设备的可执行文件(通常是共享库.so文件)。

开发人员可以使用ndk-build来创建一个名为Android.mk的构建脚本,该脚本描述了需要编译的源文件、库依赖关系以及编译选项等信息。然后通过运行ndk-build命令,NDK会根据Android.mk文件中的描述来进行编译和链接,生成最终的可执行文件。

虽然ndk-build是一个功能强大的构建工具,但在新版本的Android NDK中,Google推荐开发者使用Cmake作为ndk-build的替代方案:Gradle来管理和构建原生代码。CMake具有更灵活和现代化的配置语法,同时也更好地集成到Android Studio和Gradle构建系统中。因此,如果你正在考虑使用NDK来开发Android应用,并且需要集成C/C++代码,可能更倾向于使用CMake作为构建工具。

中间件(middleware)是指位于软件系统或应用程序的不同组件之间的一种软件。它通常用于处理和转发数据、消息或请求,以便在不同的系统组件之间进行通信和交互。

在计算机科学和软件工程领域,中间件充当了连接不同组件的桥梁,帮助它们协同工作。中间件可以提供各种功能,包括但不限于:

  1. 通信支持:提供网络通信、消息传递、远程过程调用(RPC)等功能,以便不同的系统可以进行通信和交换信息。
  1. 数据库访问:为应用程序提供对数据库的访问,包括连接池管理、事务处理等功能。
  2. 安全性和身份验证:提供身份验证、授权和加密功能,确保系统的安全性。
  3. 事务处理:支持分布式事务处理,确保跨多个组件的操作能够一致地执行和回滚。
  4. 资源管理:管理系统资源,如线程池、连接池等,以优化系统性能和资源利用率。
  5. 消息队列:提供消息队列服务,用于异步通信和解耦系统组件。

中间件通常被设计为可重用的模块,并且在不同的系统和应用程序中广泛应用。它们有助于简化系统架构,提高系统的可扩展性、可维护性和互操作性。常见的中间件包括消息队列系统(如RabbitMQ、Kafka)、应用服务器(如Tomcat、WebSphere)、RPC框架(如gRPC、Dubbo)等。

问题不解:开发文档中为什么都是源码?到底该怎么使用呢?之前android开发都是有完整的SDK,开发者直接调用就好了。那么源码与SDK之间的关系是什么呢?

       Android源码是开源的:

       Android 的每个版本的源码是公开的,Google 将 Android 的源代码以开源的形式发布在 Android 开源项目(AOSP)上。

AOSP 是一个开放的软件项目,它包含了 Android 操作系统的完整源代码、工具链和相关文档。任何人都可以访问 AOSP 并下载 Android 的源代码进行阅读、分析和编译。

然而,需要注意的是,虽然 Android 的源码是公开的,但是 Google 在每个版本发布时会将一些特定的功能和服务作为 Google Play 服务(Google Play Services)的一部分进行封闭。这些功能包括 Google Play 商店、Google 地图、Gmail 等。如果你想要使用这些封闭的功能,你需要在设备上安装 Google Play 服务。

此外,厂商在生产 Android 设备时可以根据他们的需求进行定制和修改,所以最终用户在购买不同厂商的 Android 设备时可能会发现一些差异。这些定制和修改通常不包含在 AOSP 中,而是由各个厂商自行管理。

你可能感兴趣的:(android相关,android,c语言,java)