自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (1)
  • 收藏
  • 关注

原创 Android studio C++调试问题汇总

网上搜了很多资料,大概原因是由于library一般会以release方式的形式编译,所以生成的so不包含符号表,因此无法断点。首先,需要找到library的符号表所在的目录,如下图的所示,在library的build目录下搜索相应的so,然后文件大小最大的那个SO就是带符号表的SO。如下图所示project共有app和nativelib两个模块,但app模块下的cpp文件可以正常断点,但nativelib模块下的cpp不能断点。问题1:如下图所示,cpp目录不显示或cpp目录不显示C++源文件。

2023-06-12 12:02:47 959

原创 使用Android studio来开发framework.jar

使用Android studio来开发framework.jar

2023-03-01 15:47:29 800

原创 数据结构之排序算法

各种排序算法的C代码实现

2022-09-28 09:49:33 674

原创 深入浅出Android NDK之ASan检测内存越界

Address Sanitizer使用注意事项

2022-02-25 10:25:15 4114 2

原创 KMP算法前后缀原理

要想把把KMP算法搞清楚,必须要先了解一个叫做BF的暴力破解算法。这个算法的思路相当简单,是在串区配中最容易想到的一个算法。其实就是把所有有可能的串挨个比较一遍,这样匹配的结果一定是正确的。如上图所示,T是主串,P是模式串,i是主串T当前的位置,j是模式串P当前的位置,当i=4,j=4时发现T[i]!=P[j],BF算法会将i回溯为1,j回溯为0重新进行下一轮的对比。下面我们来考虑一个问题,当i=4,j=4检测到字符不相等时,到底有没有必要把i回溯到1,j回溯到0?如果我们能确定即使把i回溯到1,j回

2020-12-15 17:36:29 1595 1

原创 深入浅出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 551

原创 深入浅出Android NDK之重写JNIEnv函数

试想一下如果在代码中调用了env->NewGlobalRef但是忘记了调用env->DeleteGlobalRef造成了内存泄露,该怎么样查找这个问题?在代码量小的情况下,我们可以一行一行的查找。如果代码量很庞大呢?甚至这个代码是以前的同事写的,你根本不熟悉,又该怎么查找呢?如果我们能够重写JNIEnv的NewGlobalRef/DeleteGlobalRef函数就能完美的解决这个问...

2020-03-31 16:34:40 739

原创 深入浅出Android NDK之打印调用堆栈

为了能在native层打印函数的调用堆栈,找了好久的资料,最后终于找到一个靠谱的链接:https://www.jianshu.com/p/4a5eeeee6d29主要通过调用_Unwind_Backtrace函数来获得函数的调用堆栈,但是原文的并不好用,地址通过addr2line转换以后得不到函数名和行号,主要原因我们得到的地址是运行时地址,应该减去SO的基地址再来转换,下面看我改造后的例子,...

2020-03-27 19:15:04 2806

原创 深入浅出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 811

原创 深入浅出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 1426

原创 深入浅出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 323 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 449

原创 深入浅出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 822 1

原创 pdf2htmlEx学习笔记之ubuntu编译

按照官方文档的描述【https://github.com/coolwanglu/pdf2htmlEX/wiki/Building】,使用如下代码编译:git clone git://github.com/coolwanglu/pdf2htmlEX.gitcd pdf2htmlEXcmake . && make && sudo make install执行c...

2020-03-20 14:09:52 758 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 739 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 368

原创 深入浅出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 1384 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 772

原创 深入浅出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 1471

原创 深入浅出Android NDK之使用RegisterNatives函数动态注册native函数

在上一章中我们所使用的注册native函数的方式叫做静态注册,这种方式的原理是,当调用native函数时,如果native函数还没有被链接到C/C++函数,虚拟机机会去SO的符号表中寻找名称为(Java_包名_类名_函数名)的函数,找到后将C函数地址链接到java的native函数,之后就可以调用native函数了。所以静态注册的关键在于,java层和C层对函数名称有一个共同的约定,在java层...

2020-03-18 12:08:36 2197

原创 深入浅出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 554

原创 深入浅出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 519

原创 深入浅出Android NDK之将Android.mk导入Android Studio

今天我们介绍怎么在Android Studio中编写、编译C/C++源代码。在Android Studio中编写源代码还是不错的,编写代码有代码提示,阅读代码可以查找引用,写完代码后,直接可以运行,运行的时候也可以打断点调试,虽然断点不太好用,经常会乱跳,但总比没有要好。一般我只把Anddroid studio作为一个编写代码和查看代码的工具,编译我更喜欢自己写一个批处理脚本,在批处理里面调用n...

2020-03-17 15:18:21 1229

原创 深入浅出Android NDK之多模块依赖

之前我们说过,在Android.mk中我们可以指定多个模块。一个动态库或者可执行文件,可以依赖其他的动态库或者静态库。在Android.mk中可以通过LOCAL_STATIC_LIBRARIES指定当前模块所依赖的静态库模块,通过指定LOCAL_SHARED_LIBRARIES指定当前模块所依赖的动态库模块。下面我们看个例子:LOCAL_PATH := $(call my-dir)in...

2020-03-16 18:57:06 1356 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 1200

原创 深入浅出Android NDK之Android.mk常用C/C++编译选项

在之前的深入浅出Android NDK之Hello-Ndk一章我们已经学习了编译一个动态库、静态库、可执行文件所需要的最基本的编译指令。LOCAL_SRC_FILES 可用于指定编译的源文件列表。除了源文件列表外,通常在编译时我们还需要指定头文件的搜索路径。...

2020-03-16 16:19:40 3713 1

原创 深入浅出Android NDK之Android.mk基本语法

这一节我们来讲一下Android.mk的基本语法,在上一节我们提到了Android.mk其实就是Makefile,但是对于windows程序员来说很少有人会写Makefile,所以这一节我们来给大家介绍一下Makefile的基本语法。Makefile的语法以及编译流程其实挺复杂,做为windows平台的开发程序员的我其实也没有完全弄明白,但是好在Android.mk更像一个Makefile的模板...

2020-03-12 17:38:03 953

原创 深入浅出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 1039

原创 深入浅出Android NDK之课程简介

很早以前就想写一篇关于NDK的教程,只可惜一直没有时间。由于NDK在app中的使用场景有限,市面上介绍NDK的资料也是少之又少,所以NDK的学习难度相当之大。从今天开始,我将向大家详细介绍NDK的使用教程。要想学习NDK开发,首先你必需要会两门语言,JAVA、C或者JAVA、C++。NDK和...

2020-03-11 17:43:56 415

原创 Android横竖屏切换卡顿问题

今天遇到一个android系统在切换横竖屏时一直卡着不动,大概3秒以后才能转过来的问题。最后定位到是由于ScreenRotationAnimation类的构造函数调用了SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay( SurfaceControl.BUILT_IN_DISPLAY...

2020-03-11 15:09:54 1959

原创 使用leak-analyze-addr2line解析泄露日志

在上篇博客中,我使用了自定义bat脚本解析leaktrace.log的方式,得到了泄露的堆栈。(https://blog.csdn.net/taohongtaohuyiwei/article/details/104694747)之后发现,原来leaktrace已经提供了解析工具,参考以下两篇文章:https://cloud.tencent.com/developer/article/14475...

2020-03-11 10:38:05 663

原创 Android上使用LeakTracer检测native内存泄露

今天遇到了内存泄露问题,每打开关闭书一次,native的内存就增长一些。于是就在网上搜了搜,看看android有没有检测native内存泄露的工具。我搜索了一天,先后参考了以下链接:https://www.cnblogs.com/zzcperf/p/9563389.htmlhttps://blog.csdn.net/u010481276/article/details/78959368h...

2020-03-06 16:29:13 1844 1

hello-ndk.rar

一个简单的例子,用于Android ndk的Hello world代码,供大家免费下载使用。

2020-03-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除