Android JNI系列详解之ndk-build工具的使用

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

一、Android项目中使用ndk-build工具编译库文件

之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。

ndk-build目前主要有两种配置使用方式:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

 如上图所示,第一种方式是Android.mk+Application.mk+gradle的方式生成库文件;第二种方式是Android.mk+Application.mk+命令行的方式生成库文件,接下来就是介绍这两种方式的使用。

1、ndk-build配置构建1(Android.mk+Application.mk+gradle)

Android.mk:用于向ndk-build编译工具描述源文件和库的信息,如要生成什么类型的库(动态、静态),库的名称,以及生成库使用了哪些C/C++源码文件,或者使用了哪些第三方库文件,等等。

Application.mk:工程级别的,作用是指定ndk-build的项目范围设置,如C/C++标准库的支持,Android平台版本设置,cpu指令集对应的abi设置,等等。

Android.mk是ndk-build编译必配的一个文件,Application.mk是可选配的(如编译的目标库未使用C/C++标准库,也不需要指定cpu指令集对应的abi),如果未配置Application.mk会走默认的这些配置。Application可选配的另一个原因是,里面的配置可以放到gradle中配置。

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

1. LOCAL_PATH表示源文件所在的位置,call my-dir是表示会调用ndk-build提供的宏函数my-dir,这个方法会返回Android.mk文件本身所在的目录路径。

2.include $(CLEAR_VARS) 用于清理部分LOCAL开头的变量,但不会清理上面的LOCAL_PATH。

3.LOCAL_MODULE表示配置库的名称。

4.LOCAL_SRC_FILES表示配置的源文件,生成库需要哪些源文件或者第三方库。

5.include $(BUILD_SHARED_LIBRARY) 表示指定编译目标库类型(静态动态)

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

1.APP_STL 表示配置C++标准库支持

2.APP_ABI 表示配置abi过滤

3.APP_PLATFORM 表示指定Android平台版本

2、新建项目使用ndk-build编译源代码

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI不同于CMake的项目,我们重新新建了一个项目

haha.cpp  native源文件:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNIC++源码文件和CMake那边差不多

Android.mk:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

Application.mk:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

build.gradle:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

配置好这些文件之后,我们make一下项目,在build目录下就生成了库文件:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

Android中使用上面生成的库文件:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

运行:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

3、ndk-build配置构建2(Android.mk+Application.mk+命令终端)

这种方式就是比较方便,不依赖于AS这种ide工具,可以在文件夹下便可以编译出库文件。

这种方式需要将上面放在cpp文件夹下的文件,换到jni文件下,目前不知道啥原因。

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

另外我把gradle中的之前的配置都删了:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

开始使用终端命令进行编译:今入到这个jni的目录中,输入ndk-build回车就行。

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

生成的库文件在:自动放在了jni同级文件夹下的libs文件夹中:另外多了个obj文件夹,不用管。

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI这时候去运行项目,会出现崩溃,错误是找不到libhaha.so

Android中使用上面生成的库文件:android项目中要使用库文件,要将库文件放到Android默认的系统jni目录:jniLibs,因此我们将上面的libs改成jniLibs,重新运行,正常:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

如果就是想使用上面生成的libs文件夹,也是可以的,就需要在gradle中配置一下:

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI这种方式就是将来编译的时候,去找jniLibs就会自动去src/main/libs下面找我们的库文件,打包进apk里面。

二、配置库文件的输出路径

上面的ndk-build编译过程,我们都没指定我们想要输出的路径,都是使用默认的目录,要么在build下,要么在libs目录下,这里我们配置文件的输出目录。

在Android.mk下配置如下

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

../jniLibs是香炉路径,相对的是Android.mk的位置。../是代表的Android.mk的上一级目录,即在mk文件的上一级同级的目录下创建jniLibs目录。

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI

使用ndk-build命令就可以看到生成了jniLibs目录。这样jniLibs就是编译apk的时候默认寻找的目录。

如果是这个目录,我们的build.gradle中就不需要指定这个

Android JNI系列详解之ndk-build工具的使用,NDK开发,android,NDK,JNI文章来源地址https://www.toymoban.com/news/detail-693236.html

到了这里,关于Android JNI系列详解之ndk-build工具的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Android -- JNI 和 NDK】Java 和 C/C++ 之间传递参数和返回值

    本文主要介绍 JNI 的数据传递上,即 Java 如何传递对象给 C++; 而 C++ 又如何将数据封装成 Java 所需的对象。 1. 基本数据类型 传递 java 的基本类型是非常简单而直接的,一个 jxxx 之类的类型已经定义在本地系统中了,比如: jint, jbyte, jshort, jlong, jfloat, jdouble, jchar 和 jboolean 分别

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

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

    2024年02月14日
    浏览(42)
  • Android JNI系列详解之CMake配置库文件的输出目录

    一、前提 阅读上一篇文章Android JNI系列详解之CMake编译工具的使用,里面讲到了需要配置两个文件:CMakeList.txt和build.gradle 二、配置CMake编译工具输出库文件的路径 1.默认的库文件输出路径:app/build/intermediates/cmake/debug/obj 由此可见不便于每次查找,因此我们需要将这个路径配置

    2024年02月10日
    浏览(30)
  • Android NDK开发详解之使用预构建库

    NDK 支持使用预构建库(同时支持静态库和共享库)。此功能有以下两个主要用例: 本页将介绍如何使用预构建库。 声明预构建库 您必须将自己使用的每个预构建库声明为一个独立模块。为此,请执行以下步骤: 下面这个简单的示例假设预构建库 libfoo.so 与描述它的 Android

    2024年02月06日
    浏览(33)
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(35)
  • android studio里面build.gradle文件说明,ndk版本和gradle插件关系

    一、上述的android gradle 插件版本和gradle版本 对应关系         Android Gradle 插件版本说明  |  Android 开发者  |  Android Developers           二、修改gradle版本(gradle-wrapper.properties文件),gradle插件版本(build.gradle文件)            NDK版本默认是根据配置Android Gradle插

    2024年02月16日
    浏览(29)
  • (NDK编译)详解使用Android.mk编译的C/C++程序过程

    想要在 Android设备 上运行 C/C++程序 可执行文件,可采用一个方法就是使用 NDK编译 ,很多时候要比 gcc编译 更适合,这里我采用的是 imx6q开发板 上面装载了自己编写的Android6.0.1镜像,在 Ubuntu64位 系统上采用NDK编译。 目录 1.准备文件 2.编写Android.mk 注意 完整Android.mk代码 3.NDK编

    2024年02月05日
    浏览(35)
  • Android之 JNI详解

    一、JNI简介 JNI 是Java Native Interface的缩写,表示Java本地调用,通过JNI技术可以实现Java调用C程序和C程序调用Java代码。 二、JNI函数注册 2.1 静态注册: 静态注册的方式我们平时用的比较多。我们通过javac和javah编译出头文件,然后再实现对应的cpp文件的方式就是属于静态注册的

    2024年04月27日
    浏览(26)
  • Android:JNI实战,理论详解、Java与Jni数据调用

    上一篇博文《Android:JNI实战,加载三方库、编译C/C++》讲解了如何搭建一个可以加载和链接第三方库、编译 C/C++ 文件的 Jni Demo App。 这篇博文在这个 Jni Demo App 的基础上,从实战出发详细讲解  Jni  开发语法。 接下来,先用一小节将 Jni 开发比较重要的理论知识点过一下,然

    2024年01月23日
    浏览(39)
  • Android NDK开发详解之Android.mk探秘

    本页介绍了 ndk-build 所使用的 Android.mk 构建文件的语法。 概览 Android.mk 文件位于项目 jni/ 目录的子目录中,用于向构建系统描述源文件和共享库。它实际上是一个微小的 GNU makefile 片段,构建系统会将其解析一次或多次。Android.mk 文件用于定义 Application.mk、构建系统和环境变量

    2024年02月06日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包