Android NDK开发详解之JNI中的库文件

这篇具有很好参考价值的文章主要介绍了Android NDK开发详解之JNI中的库文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:

    在平台之间移植其应用。
    重复使用现有库,或者提供其自己的库供重复使用。
    在特定情况下提高性能,特别是像游戏这种计算密集型应用。

工作原理

本部分介绍了在为 Android 构建原生应用时使用的主要组件,并且介绍了构建和封装过程。
主要组件

在构建应用时,您应该已经了解以下组件:

    原生共享库:NDK 从 C/C++ 源代码构建这些库或 .so 文件。

    原生静态库:NDK 也可构建静态库或 .a 文件,而您可将静态库关联到其他库。

    Java 原生接口 (JNI):JNI 是 Java 和 C++ 组件用于相互通信的接口。本指南假设您具备 JNI 知识;如需了解相关信息,请查阅 Java 原生接口规范。

    应用二进制接口 (ABI):ABI 可以非常精确地定义应用的机器代码在运行时应该如何与系统交互。NDK 根据这些定义构建 .so 文件。不同的 ABI 对应不同的架构:NDK 为 32 位 ARM、AArch64、x86 及 x86-64 提供 ABI 支持。如需了解详情,请参阅 Android ABI。

    清单:如果您编写的应用不包含 Java 组件,必须在清单中声明 NativeActivity 类。要详细了解如何执行此操作,请参阅使用 native_activity.h 接口。

流程

为 Android 开发原生应用的一般流程如下:

  设计应用,确定要使用 Java 实现的部分,以及要以原生代码形式实现的部分。
    注意:虽然可以完全避免使用 Java,但您可能会发现 Android Java 框架对于控制显示和界面等任务很有用。

    像创建任何其他 Android 项目一样创建一个 Android 应用项目。

    如果要编写纯原生应用,请在 AndroidManifest.xml 中声明 NativeActivity 类。如需了解详情,请参阅原生 activity 和应用。

    在“JNI”目录中创建一个描述原生库(包括名称、标记、关联库和要编译的源文件)的 Android.mk 文件。

    或者,您也可以创建一个配置目标 ABI、工具链、发布/调试模式和 STL 的 Application.mk 文件。对于其中任何您未指明的项,将分别使用以下默认值:
        ABI:所有非弃用的 ABI
        模式:发布
        STL:系统

    将原生源代码放在项目的 jni 目录下。

    使用 ndk-build 编译原生(.so、.a)库。

    构建 Java 组件,生成可执行 .dex 文件。

    将所有内容封装到一个 APK 文件中,包括 .so、.dex 以及应用运行所需的其他文件。

原生 activity 和应用

Android SDK 提供了辅助类 NativeActivity,可用于编写完全原生的 activity。NativeActivity 可处理 Android 框架与原生代码之间的通信,因此您不必子类化该类或调用其方法,而只需在 AndroidManifest.xml 文件中将您的应用声明为原生应用,然后开始创建该原生应用。

使用 NativeActivity 的 Android 应用仍会在其自己的虚拟机中运行,与其他应用以沙盒的形式分隔。因此,您仍可通过 JNI 访问 Android 框架 API。在某些情况下(例如对于传感器、输入事件和资源),NDK 提供可使用的原生接口,而无需通过 JNI 调用。如需详细了解此类支持,请参阅原生 API。

无论是否要开发原生 activity,我们都建议使用传统 Android 构建工具创建项目。这样有助于确保使用正确的结构构建和封装 Android 应用。

Android NDK 为实现原生 activity 提供两个选项:

    native_activity.h 头文件会定义 NativeActivity 类的原生版本。其中包含创建原生 activity 所需的回调接口和数据结构。由于应用的主线程会处理回调,因此回调实现不能阻止主线程,否则可能会收到 ANR(应用无响应)错误,因为主线程在回调返回之前无响应。
    android_native_app_glue.h 文件会定义基于 native_activity.h 接口构建的静态辅助库。它会派生出另一个线程,用于处理事件循环中的回调或输入事件等。将这些事件移至单独的线程可防止任何回调阻止主线程。

此外,<ndk_root>/sources/android/native_app_glue/android_native_app_glue.c 源代码也可供使用,使您能够修改实现。

如需详细了解如何使用此静态库,请查看原生 activity 示例应用及其文档。<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h 文件中的注释提供了更多其他信息。
使用 native_activity.h 接口

要使用 native_activity.h 接口实现原生 activity,请执行以下操作:

在项目的根目录中创建一个 jni/ 目录。此目录用于存储所有原生代码。

在 AndroidManifest.xml 文件中声明原生 activity。

由于您的应用没有 Java 代码,因此请将 android:hasCode 设为 false。
<application android:label="@string/app_name" android:hasCode="false">

您必须将 activity 标记的 android:name 属性设置为 NativeActivity。

<activity android:name="android.app.NativeActivity"
          android:label="@string/app_name">

注意:您可以子类化 NativeActivity。如果子类化该类,请使用子类的名称,而不是 NativeActivity。

meta-data 标记的 android:value 属性会指定共享库的名称,其中包含应用的入口点(例如 C/C++ main),省略库名的 lib 前缀和 .so 后缀。


<manifest>
  <application>
    <activity>
      <meta-data android:name="android.app.lib_name"
                 android:value="native-activity" />
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

创建用于原生 activity 的文件,并实现 ANativeActivity_onCreate 变量中指定的函数。应用在原生 activity 启动时会调用此函数。此函数类似于 C/C++ 中的 main,它会接收 ANativeActivity 结构的指针,其中包含您需要编写的各个回调实现的函数指针。在 ANativeActivity->callbacks 中设置回调实现的适用回调函数指针。

将 ANativeActivity->instance 字段设置为您要使用的特定数据的任何实例的地址。

实现您希望 activity 在启动时执行的任何其他操作。

实现您在 ANativeActivity->callbacks 中设置的其余回调。如需详细了解何时调用回调,请参阅管理 activity 生命周期。

开发应用的其余部分。

在项目的 jni/ 目录中创建 Android.mk file,向构建系统描述您的原生模块。如需了解详情,请参阅 Android.mk。

创建 Android.mk 文件后,使用 ndk-build 命令编译原生代码。


cd <path>/<to>/<project>
$NDK/ndk-build

像平常一样构建和安装 Android 项目。如果原生代码存放在 jni/ 目录中,构建脚本会自动将从原生代码构建的 .so 文件封装到 APK 中。文章来源地址https://www.toymoban.com/news/detail-737134.html

到了这里,关于Android NDK开发详解之JNI中的库文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio中获取sha1证书指纹数据的方法以及keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore的解决

    Android Studio通过电脑命令提示符获取SHA1 注:1、首先给keytool路径(C:Program FilesJavajdk1.8.0_172bin)加入环境变量。 2、我是直接的E盘根目录下操作的。 第一步、打开电脑命令提示符(运行-cmd); 第二步、命令提示符中敲入:  keytool -genkey -v -keystore debug.keystore -alias androiddebugke

    2024年02月07日
    浏览(48)
  • Android JNI系列详解之ndk-build工具的使用

    一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式:  如上图所示,第一种方式是Android.mk+Application.mk+gradle的方式生成库文件;第二种方式是Android.mk+Application.mk+命

    2024年02月10日
    浏览(34)
  • windows执行完LoadLibrary()后,可以删除源动态库文件,函数不会锁库文件

    windows执行完LoadLibrary()后,可以删除源动态库文件,函数不会锁库文件。 运行结果:

    2024年02月13日
    浏览(38)
  • 【Linux基础】库文件

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 ​​         在Linux系统中,库文件(Library files)是一

    2024年02月16日
    浏览(46)
  • Android JNI系列详解之CMake和ndk-build编译工具介绍

    一、前提 CMake和ndk-build只是编译工具,本次主要介绍ndk-build和CMake的区别,下节课介绍他们的使用。 二、CMake工具介绍 CMake:cross platform make,是跨平台的编译工具 CMake是在AndroidStudio2.2之后引入(目前默认的NDK编译工具),使用时配合CMakeList.txt和gradle。 对C++的配置: 默认配置

    2024年02月12日
    浏览(34)
  • linux下头文件及库文件搜索路径知识汇总

    跟gcc相关的搜索目录: 安装gcc时,如果有指定prefix的话,那么系统的默认搜索路径为: C_INCLUDE_PATH:编译 C 程序的时候使用的环境变量 CPLUS_INCLUDE_PATH:编译 C++ 程序的时候使用的环境变量 CPATH:编译 C、 C++及Objective-C 程序时使用的环境变量 OBJC_INCLUDE_PATH:编译 Objective-C 程序

    2023年04月27日
    浏览(39)
  • C标准库文件&常用函数

    编号 头文件 C标准版本 介绍 1 assert.h C89/C90 条件编译宏,将参数与零比较 2 ctype.h C89/C90 用来确定包含于字符数据中的类型的函数 3 errno.h C89/C90 报告错误条件的宏 4 float.h C89/C90 浮点数类型的极限 5 limits.h C89/C90 基本类型的大小 6 locale.h C89/C90 本地化工具 7 math.h C89/C90 常用数据函

    2024年02月12日
    浏览(45)
  • C++有哪些常用的库文件

    常用库文件: iostream:  输入输出流库,包含cin、cout、cerr等标准输入输出对象。 string : 字符串库,包含字符串类型std::string及相关操作函数。 vector : 动态数组库,包含vector类型及相关操作函数。 map:  字典库,包含map、multimap、set、multiset等关联容器类型及相关操作函数。 algorithm

    2024年02月02日
    浏览(42)
  • Android StudioJNI开发之NDK环境的搭建以及添加JNI支持(图文解释 简单易懂)

    有问题可以评论区留言讨论~~~ Android系统的所谓原生开发是在App中调用C/C++代码,鉴于这两个语言具有跨平台的特性,如果某项功能使用C/C++实现,就很容易在不同平台之间移植。 完整的Android环境包括三个开发工具。分别是JDK SDK NDK 分别简述如下 1:JDK是Java代码的编译器 因为

    2024年02月14日
    浏览(52)
  • 7-LINUX--库文件的生成与使用

    库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其命令规则为 libxxx.a,一种是共享库,其命令规则为

    2024年03月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包