NDK
Luckie stone
Android应用开发。
展开
-
Android NDK 面试题汇总
一、谈谈你对 JNI 和 NDK 的理解JNI:JNI 是Java Native Interface的缩写,即 Java 的本地接口。目的是使得 Java 与本地其他语言(如 C/C++)进行交互。JNI 是属于 Java 的,与 Android 无直接关系。NDK:NDK 是Native Development Kit的缩写,是 Android 的工具开发包。作用是更方便和快速开发 C/C++ 的动态库,并自动将动态库与应用一起打包到 apk。NDK 是属于 And...转载 2020-08-03 20:42:17 · 994 阅读 · 0 评论 -
so 动态库崩溃问题定位(addr2line与objdump)
一、需求分析so 的崩溃并不像 Java 代码那么好定位,我们通常看到的就只是 so 中的一大段崩溃的堆栈信息。那么我们怎么通过这个堆栈信息来定位我们的问题呢?二、addr2line1. 介绍Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。一般适用于 debug 版本或带有 symbol 信息的库。2. 工具位置我们下载的 NDK 里面已经默认有了这个工具,对应的路径如..转载 2020-08-03 20:40:20 · 2183 阅读 · 0 评论 -
Android Studio 配置一键生成 JNI 头文件工具
一、前言我们知道进行 NDK 开发中,native 方法大多是需要进行静态注册的,如果手动一个个写,不仅容易出错,而且繁琐和浪费时间。那么有什么好用的工具可以使用呢?这个其实是有的,就在我们的JDK中就有一个javah.exe工具帮助我们生成 JNI 的头文件,我们只需要将其配置到 Android Studio 中就可以很方便的使用它了。二、效果示例如下,com_afei_openglsample_NativeRenderer.h 就是一个自动生成的头文件了,可以省去我们很多工夫,那么该..转载 2020-08-03 20:36:36 · 726 阅读 · 0 评论 -
NDK工具链的生成和配置(图文解说)
一、NDK 工具链是什么简单的说,就是 NDK 编译工程使用的东西,我们的目的就是把它抽出来在任何地方都可以直接、方便的使用。二、步骤1. 下载 NDK,并切到/build/tools/目录,例如2. 执行如下命令 ./make-standalone-toolchain.sh --platform=android-21 --install-dir=$TARGET_DIR/android-armv7 --arch=arm ./make-standalone-toolcha...转载 2020-08-03 20:34:49 · 542 阅读 · 0 评论 -
NDK/JNI 开发之 Java 类和 C 结构体互转示例
一、简介JNI 开发中,常常会存在对应的 Java 类和 C 结构体需要互相转换。通过本实例学习和了解这个过程。预备知识:JNI数据类型和类型描述符介绍:https://blog.csdn.net/afei__/article/details/80899758 JNI 方法及使用示例:https://blog.csdn.net/afei__/article/details/81016413二、目标我们的目标就是通过 JNI 来完成下面两个类/结构体的互相转化。1. Java 类以转载 2020-08-03 20:30:26 · 777 阅读 · 0 评论 -
NDK 开发之 Bitmap 的使用
一、前言Bitmap 是 Android 中经常使用到的图片操作的一个类,它包含了图片的宽、高、格式、像素等信息。那么我们怎么在 NDK 中使用它呢。二、bitmap.h1. 介绍NDK 已经为我们准备好了在 NDK 中操作 Bitmap 的相关头文件了,它就是 <android/bitmap.h>。我们先来看看这个头文件里面都包含哪些重要的信息吧。2. AndroidBitmapInfo一个包含 Bitmap 常用信息的结构体,定义如下:/** Bitmap.转载 2020-08-03 20:25:53 · 463 阅读 · 0 评论 -
NDK 开发之“文件夹遍历”(C++文件夹遍历)
Java 层只给 JNI 层传递文件夹路径,在 JNI 中完成文件夹里的文件操作,通常都避免不了需要使用到文件夹遍历这个功能。那么,在 NDK 开发中怎么进行文件夹的遍历呢?其实这就和 C++ 的文件夹遍历方式差不多。NDK 也给我们提供了<dirent.h>头文件,通过这个头文件中的相关方法,我们就可以完成这个功能了。native-lib.cpp代码如下:#include <jni.h>#include <string.h>#include &...转载 2020-08-03 20:18:54 · 478 阅读 · 0 评论 -
NDK 开发之耗时统计工具类(也适用于 C/C++ 工程)
一、需求分析在开发阶段中,经常会需要打印出某些方式或步骤的耗时情况,大致需求如下:能打印出某个步骤的耗时; 有开关可以控制打开和关闭耗时统计; 使用方便。二、准备工作之前介绍过一个 log 输出的工具类,可以沿用,链接为:https://blog.csdn.net/afei__/article/details/81030373。LogUtils.h 示例:#ifndef _LOG_UTILS_H_#define _LOG_UTILS_H_#ifdef __ANDROID__转载 2020-08-03 20:14:46 · 355 阅读 · 0 评论 -
NDK 开发之 Android LOG 工具类
一、背景介绍一般在 JNI 层输出Android log 时,不会直接使用原生的接口,而是做一层简单的封装。我们希望输出一种带有文件名、方法名、行号等信息的 Android log,可以帮组我们更加快速的定位 log 是在何处输出的。并且,我们希望可以很轻松的控制 log 的打开和关闭。二、LogUtils.h 工具类如果想要关掉 log,注释掉 #define DEBUG 的定义就行。当然更好的做法是动态的定义这个宏。#ifndef _LOG_UTILS_H_#def...转载 2020-08-03 20:12:15 · 420 阅读 · 1 评论 -
Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解
一、ABI 是什么ABI 是 Application Binary Interface 的缩写。不同 Android 手机使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为应用要使用的每个 CPU 架构指定 ABI。典型的 ABI 包含以下信息:机器代码应使用的 CPU 指令集。 运行时内存存储和加载的字节顺序。 可执行二进制文件(例如程序和共享库)的格转载 2020-08-03 20:08:40 · 5786 阅读 · 0 评论 -
Android Studio build.gradle 中配置 cmake,及各 arguments 详解
一、简介 在 Android Studio 2.2 以上的版本,推荐使用 CMake 来编译工程里的 C/C++ 代码(包括 JNI 部分)。 一般来言,我们只需要关注和编写 CMakeLists.txt 即可,至于 CMake 如何编译,以及使用的什么样的配置选项是不怎么关心的(会有一系列默认的配置)。不过,如果你需要更改或者定制化一些编译的选项,你就需要了解一下如果在 gradle 中配置这些信息了。二、如何在 gradle 中使用 cmake 的变量android {...转载 2020-08-03 20:04:41 · 1431 阅读 · 0 评论 -
CMakeLists.txt 语法介绍与实例演练
一、Cmake 简介cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。二、常用命令1. 指定 cmake 的最小版本cmake_minimum_required(VERSION 3.4.1)这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行.转载 2020-08-03 20:04:27 · 137 阅读 · 0 评论 -
Android.mk 语法和变量介绍
一、简介Android.mk是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件。官网对Android.mk的介绍:https://developer.android.com/ndk/guides/android_mk二、一些超级基本的语法例如我们使用#表示注释,使用$()表示取值,使用:=表示赋值,使用+=表示附加等等。在学习之前,我们起码得看得懂这些。示例:# 注释内容使用 "#" 号 # call 是调用一个系统提供的宏函数,此处是 m...转载 2020-08-03 20:04:06 · 245 阅读 · 0 评论 -
JNI 静态注册和动态注册
一、前言当执行一个 Java 的 native 方法时,虚拟机是怎么知道该调用 so 中的哪个方法呢?这就需要用到注册的概念了,通过注册,将指定的 native 方法和 so 中对应的方法绑定起来(函数映射表),这样就能够找到相应的方法了。注册分为静态注册和动态注册两种。默认的实现方式即静态注册。二、静态注册1. 定义通过 JNIEXPORT 和 JNICALL 两个宏定义声明,在虚拟机加载 so 时发现上面两个宏定义的函数时就会链接到对应的 nati...转载 2020-08-03 20:03:21 · 321 阅读 · 0 评论 -
JNI 方法大全及使用示例
一、说明这里介绍的函数大多是 NDK 开发中常用的函数,但并不是全部,内容稍多,基本可以满足我们的开发需求了,建议通过目录索引来找需要了解的。 这里的函数都是 JNIEnv 操作的相关函数,JNI_OnLoad 等 JavaVM 的方法不在这里介绍。 JNI 有 C、C++ 两种代码风格,即: C风格:(*env)->NewStringUTF(env, "Hellow World!"); C++风格:env->NewStringUTF("Hellow World!");..转载 2020-08-03 20:03:03 · 1130 阅读 · 0 评论 -
浅谈 JNIEnv 和 JavaVM
一、概念1. JavaVmJavaVM 是虚拟机在 JNI 层的代表,一个进程只有一个 JavaVM,所有的线程共用一个 JavaVM。2. JNIEnvJNIEnv 表示Java 调用 native 语言的环境,是一个封装了几乎全部 JNI 方法的指针。JNIEnv只在创建它的线程生效,不能跨线程传递,不同线程的 JNIEnv 彼此独立。native 环境中创建的线程,如果需要访问JNI,必须要调用AttachCurrentThread 关联,并使用 DetachCurre...转载 2020-08-03 20:02:49 · 422 阅读 · 0 评论 -
JNI基础:JNI数据类型和类型描述符
一、简介在 JNI 开发中,我们知道,Java 的数据类型并不是直接在 JNI 里使用的,例如 int 就是使用 jint 来表示。那么,就如我们来认识一下这些数据类型吧。二、基本数据类型 Java数据类型 JNI本地类型 C/C++数据类型 数据类型描述 boolean jboolean unsigned char ...转载 2020-08-03 20:02:32 · 1056 阅读 · 0 评论 -
NDK开发第一课:环境配置与第一个JNI程序
一、JNI 与 NDK1. JNI 是什么JNI 是 Java Native Interface 的缩写,即 Java 的本地接口。目的是使得 Java 与本地其他语言(如 C/C++)进行交互。JNI 是属于 Java 的,与 Android 无直接关系。2. NDK 是什么NDK 是 Native Development Kit 的缩写,是 Android 的工具开发包。作用是快速开发 C/C++ 的动态库,并自动将动态库与应用一起打包到 a...转载 2020-08-03 20:01:54 · 166 阅读 · 0 评论 -
Android NDK 从入门到精通(汇总篇)
NDK 入门 NDK 开发第一课:环境配置与第一个 JNI 程序JNI 知识 JNI 数据类型和类型描述符 JNIEnv 和 JavaVM JNI 接口大全 JNI 静态注册和动态注册Android.mk 和 CMake 语法 Android.mk 语法和变量介绍 CMakeLists.txt 语法介绍与实例演练Android Studio 中使用 NDK gradle 配置 cmake,及各参数详解 ga...转载 2020-08-02 21:40:06 · 296 阅读 · 0 评论