深入浅出Android NDK开发
文章平均质量分 77
深入浅出Android NDK开发
sztaohongtao
这个作者很懒,什么都没留下…
展开
-
深入浅出Android NDK之ASan检测内存越界
Address Sanitizer使用注意事项原创 2022-02-25 10:25:15 · 4086 阅读 · 2 评论 -
深入浅出Android NDK之目录
深入浅出Android NDK之课程简介深入浅出Android NDK之Hello-Ndk深入浅出Android NDK之Android.mk基本语法深入浅出Android NDK之Android.mk常用C/C++编译选项深入浅出Android NDK之Application.mk以及C++支持深入浅出Android NDK之多模块依赖深入浅出Android NDK之将Android...原创 2020-03-31 18:12:24 · 547 阅读 · 0 评论 -
深入浅出Android NDK之重写JNIEnv函数
试想一下如果在代码中调用了env->NewGlobalRef但是忘记了调用env->DeleteGlobalRef造成了内存泄露,该怎么样查找这个问题?在代码量小的情况下,我们可以一行一行的查找。如果代码量很庞大呢?甚至这个代码是以前的同事写的,你根本不熟悉,又该怎么查找呢?如果我们能够重写JNIEnv的NewGlobalRef/DeleteGlobalRef函数就能完美的解决这个问...原创 2020-03-31 16:34:40 · 730 阅读 · 0 评论 -
深入浅出Android NDK之打印调用堆栈
为了能在native层打印函数的调用堆栈,找了好久的资料,最后终于找到一个靠谱的链接:https://www.jianshu.com/p/4a5eeeee6d29主要通过调用_Unwind_Backtrace函数来获得函数的调用堆栈,但是原文的并不好用,地址通过addr2line转换以后得不到函数名和行号,主要原因我们得到的地址是运行时地址,应该减去SO的基地址再来转换,下面看我改造后的例子,...原创 2020-03-27 19:15:04 · 2767 阅读 · 0 评论 -
深入浅出Android NDK之崩溃分析
假设有如下代码,运行到48行时肯定会发生崩溃。这时候我们查看logcat,会有以下输出:2019-10-16 11:21:15.943 20250-20250/? I/AEE_AED: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***2019-10-16 11:21:15.943 20250-20250/? I/...原创 2020-03-27 18:46:39 · 805 阅读 · 0 评论 -
深入浅出Android NDK之在jni中使用线程
在jni中我们可以使用pthread或者std::thread创建线程。因为线程并不是从Java环境创建的,所以这时候创建出的线程是没有JNIEnv的。如果需要使用JNIEnv,可以调用JavaVM的AttachCurrentThread将当前线程附加到虚拟机。jint AttachCurrentThread(JNIEnv** p_env, void* thr_args);AttachC...原创 2020-03-27 11:34:36 · 1411 阅读 · 0 评论 -
深入浅出Android NDK之全局弱引用的使用
新建weaktest.cpp,内容如下:#include <stdlib.h>class IShapCallback {public: virtual ~IShapCallback(){}; virtual void onLoadShap() = 0;};class Shap {public: Shap() { mCallback ...原创 2020-03-26 15:18:35 · 322 阅读 · 1 评论 -
深入浅出Android NDK之如何封装一个C++类
假设shap.h中的内容如下:class Circle {public: Circle(float x, float y, float r) { mX = x; mY = y; mR = r; } float getArea() { return 3.1415926 * mR * mR; }pu...原创 2020-03-25 11:54:31 · 446 阅读 · 0 评论 -
深入浅出Android NDK之jni三大引用(本地引用、全局引用、全局弱引用)
我们先来看一个例子,RefTest.java的内容如下:package com.example;public class RefTest { static { System.loadLibrary("strtest"); } public static native void testOverflow();}RefTest.cpp的内容如下:...原创 2020-03-20 18:41:37 · 817 阅读 · 1 评论 -
深入浅出Android NDK之异常处理
jni中的异常处理主要包括异常抛出和异常检测两个部分。抛异常提供了以下API:jint Throw(jthrowable obj);jint ThrowNew(jclass clazz, const char* message);void FatalError(const char* msg);这此API都很简单,一看就知道是啥意思,我就不想再讲了,大家有疑问的可以去查查官方文档。再次...原创 2020-03-19 16:13:14 · 731 阅读 · 1 评论 -
深入浅出Android NDK之jni对象操作
对象操作包括以内容:创建对象调用对象函数获取/设置对象属性不管哪种操作,首先需要获得类对象jclass。jni提供了两个API可以获得jclass对象:jclass FindClass(const char* name);jclass GetObjectClass(jobject obj);大部分情况下我们都会通过FindClass来获得jclass对象:比如:env->...原创 2020-03-19 14:29:13 · 367 阅读 · 0 评论 -
深入浅出Android NDK之JNI数组操作
和字符串一样,jni对数组类型也提供了特殊支持。提供了9种数组:jbooleanArray,jbyteArray,jcharArray,jshortArray,jintArray,jlongArray,jfloatArray,jdoubleArray,jobjectArray分别对应java中的:boolean[],byte[],char[],short[],int[],long[],flo...原创 2020-03-19 11:09:38 · 1364 阅读 · 1 评论 -
深入浅出Android NDK之JNI字符串转换
这一章我们学习一下JNI中相关字符串转换函数,主要有以下几个: jstring NewString(const jchar* unicodeChars, jsize len); jsize GetStringLength(jstring string); const jchar* GetStringChars(jstring string, jboolean* isCopy);...原创 2020-03-18 16:48:01 · 767 阅读 · 0 评论 -
深入浅出Android NDK之往logcat输出日志
往logcat输出日志在ndk开发的过程的一个硬性需求,虽然现在可以使用Android Studio打断点进行调试了,但是并不好用。大多数情况下,我们还是使用往logcat输出日志的方式来调试程序。C语言的printf和C++的cout是将日志输出到控制台,但在Android上,控制台是不可见的。所以我们要想显示日志,只能将log输出到logcat上。android/log.h提供了往logc...原创 2020-03-18 13:47:54 · 1465 阅读 · 0 评论 -
深入浅出Android NDK之使用RegisterNatives函数动态注册native函数
在上一章中我们所使用的注册native函数的方式叫做静态注册,这种方式的原理是,当调用native函数时,如果native函数还没有被链接到C/C++函数,虚拟机机会去SO的符号表中寻找名称为(Java_包名_类名_函数名)的函数,找到后将C函数地址链接到java的native函数,之后就可以调用native函数了。所以静态注册的关键在于,java层和C层对函数名称有一个共同的约定,在java层...原创 2020-03-18 12:08:36 · 2168 阅读 · 0 评论 -
深入浅出Android NDK之java.lang.UnsatisfiedLinkError
我们修改一下上一章的例子将com_example_hello_jni_Test.cpp的第一行注释。//#include "com_example_hello_jni_Test.h"#include <jni.h>JNIEXPORT jint JNICALL Java_com_example_hello_1jni_Test_connectV1 (JNIEnv *env, jo...原创 2020-03-17 18:31:59 · 547 阅读 · 0 评论 -
深入浅出Android NDK之Hello-JNI
通过以上几章的介绍,相信你已经完全了解了怎么使用ndk-build来编译C/C++源文件了。终于可以开始写代码了,要想在Java中调用C/C++函数,需要通过以下几步:新建一个java类,在类中声明native函数。java类中使用静态代码块调用System.loadLibrary()加载SO。通过javah生成C头文件。编译C/C++代码,实现头文件中的函数。ndk-build编译,...原创 2020-03-17 17:38:34 · 518 阅读 · 0 评论 -
深入浅出Android NDK之将Android.mk导入Android Studio
今天我们介绍怎么在Android Studio中编写、编译C/C++源代码。在Android Studio中编写源代码还是不错的,编写代码有代码提示,阅读代码可以查找引用,写完代码后,直接可以运行,运行的时候也可以打断点调试,虽然断点不太好用,经常会乱跳,但总比没有要好。一般我只把Anddroid studio作为一个编写代码和查看代码的工具,编译我更喜欢自己写一个批处理脚本,在批处理里面调用n...原创 2020-03-17 15:18:21 · 1221 阅读 · 0 评论 -
深入浅出Android NDK之多模块依赖
之前我们说过,在Android.mk中我们可以指定多个模块。一个动态库或者可执行文件,可以依赖其他的动态库或者静态库。在Android.mk中可以通过LOCAL_STATIC_LIBRARIES指定当前模块所依赖的静态库模块,通过指定LOCAL_SHARED_LIBRARIES指定当前模块所依赖的动态库模块。下面我们看个例子:LOCAL_PATH := $(call my-dir)in...原创 2020-03-16 18:57:06 · 1342 阅读 · 1 评论 -
深入浅出Android NDK之Application.mk以及C++支持
除了Android.mk之外,Application.mk也是一个很重要的配置文件。ndk-build在编译时,只依赖Android.mk和Application.mk两个文件。默认情况下,Application.mk和Android.mk一样,放在jni目录下。也可以使用在编译时通过NDK_APPLICATION_MK参数显式指定:ndk-build NDK_APPLICATION_MK...原创 2020-03-16 17:53:28 · 1191 阅读 · 0 评论 -
深入浅出Android NDK之Android.mk常用C/C++编译选项
在之前的深入浅出Android NDK之Hello-Ndk一章我们已经学习了编译一个动态库、静态库、可执行文件所需要的最基本的编译指令。LOCAL_SRC_FILES 可用于指定编译的源文件列表。除了源文件列表外,通常在编译时我们还需要指定头文件的搜索路径。...原创 2020-03-16 16:19:40 · 3672 阅读 · 1 评论 -
深入浅出Android NDK之Android.mk基本语法
这一节我们来讲一下Android.mk的基本语法,在上一节我们提到了Android.mk其实就是Makefile,但是对于windows程序员来说很少有人会写Makefile,所以这一节我们来给大家介绍一下Makefile的基本语法。Makefile的语法以及编译流程其实挺复杂,做为windows平台的开发程序员的我其实也没有完全弄明白,但是好在Android.mk更像一个Makefile的模板...原创 2020-03-12 17:38:03 · 942 阅读 · 0 评论 -
深入浅出Android NDK之Hello-Ndk
这一节,我们介绍怎么使用NDK编译C语言源文件。首先我们从以下页面下载一下最新的ndkhttps://developer.android.google.cn/ndk/downloads/截止到目前为止,NDK的最新版本是r20b,下载下来后,解析到任意文件夹。比如,我解压后的路ndk的下载,也可以参考以下链接,直接在android studio中下载。https://developer...原创 2020-03-12 14:22:54 · 1029 阅读 · 0 评论 -
深入浅出Android NDK之课程简介
很早以前就想写一篇关于NDK的教程,只可惜一直没有时间。由于NDK在app中的使用场景有限,市面上介绍NDK的资料也是少之又少,所以NDK的学习难度相当之大。从今天开始,我将向大家详细介绍NDK的使用教程。要想学习NDK开发,首先你必需要会两门语言,JAVA、C或者JAVA、C++。NDK和...原创 2020-03-11 17:43:56 · 408 阅读 · 0 评论