ndk
文章平均质量分 81
锐湃
这个作者很懒,什么都没留下…
展开
-
NDK开发、Native Hook、Android性能优化必知:动态链接
本文主要介绍了为什么要使用动态链接,动态链接中的装载时重定位与地址无关代码技术的使用,Elf 文件中动态链接的结构,以及动态链接的步骤和实现等内容。动态链接中的 .got,.got.plt 表,运行时加载等内容是掌握 Native Hook 技术的基础,在 Android 性能优化中非常常用。NDK开发、Native Hook、Android性能优化必知:动态链接。转载 2024-06-11 11:09:54 · 52 阅读 · 0 评论 -
Android崩在so里面,怎么定位Native堆栈呢?
在上述代码中,capture_backtrace函数使用_Unwind_Backtrace函数获取堆栈信息,然后我们使用dladdr函数获取到函数所在的SO库的基地址(info.dli_fbase),然后计算出函数的相对地址(relative_addr)。在这段代码中,fp变量保存了当前栈帧的FP寄存器值,也就是上一个栈帧的帧基址。需要注意的是,虽然_Unwind_Backtrace和_Unwind_GetIP函数在新版的Android系统中可用,但它们的行为可能会受到编译器优化、调试信息等因素的影响。转载 2024-06-05 21:20:31 · 112 阅读 · 0 评论 -
一篇文章教你完全掌握jni技术
jni全称java native interface,我把它分为三部分,java代表java语言,native代表当前程序运行的本地环境,一般指windows/linux,而这些操作系统都是通过C/C++实现的,所以native通常也指C/C++语言,interface代表java跟native两者之间的通信接口,jni可以实现java和C/C++通信。它是java生态的特征,所以定义在jdk标准当中。转载 2024-03-26 19:24:58 · 3523 阅读 · 1 评论 -
JNI FindClass 遇到的 NoClassDefFoundError 错误
虽然解决了 boot classLoader 加载应用类的问题,但还有一个问题需要解决,那就是调用 Java 方法之后可能会造成的循环调用问题,这里需要做一些类、方法的排除。jvmti demo 示例可查看 jvmticheck.cpp[4]转载 2024-02-20 11:20:33 · 198 阅读 · 0 评论 -
分析so文件和依赖的关系
在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场的审核。所以搞清楚so文件和依赖的关系,它不仅是一个技术指标归因的工具,也是应对厂商分包适配的利器。转载 2023-11-01 14:58:45 · 601 阅读 · 0 评论 -
JNI函数 Hook实战
上面所以讲到的内容,我都已经开源了,JniHook,希望这个库能够帮助开发者更加简单的去用上jni hook。如果对你有帮助,还请留下你的star噢!转载 2023-09-19 10:34:51 · 386 阅读 · 0 评论 -
gradle配置packagingOptions打包so库重复_Android
在安卓开发中,通常会使用到gradle来编译,在安卓项目的app目录下的build.gradle中是用来对编译进行配置的,packagingOptions 是其中的一个打包配置,常见的设置项有exclude、pickFirst、doNotStrip、merge。不能过滤aar和jar中的内容,比如项目中有些依赖库中有多余的so库,在App中并不是必需的,所以在打包的时候就可以将其过滤了。pickFirst,匹配到多个相同文件,只提取第一个,不能过滤aar和jar中的文件。转载 2023-07-17 18:08:18 · 677 阅读 · 0 评论 -
类/库/so冲突那些事,看这个就够了
这种一般都是aar提供方直接把开源库代码集成打包进去,然后遇到了同样做法的.exclude 是无用的.解决方案只有一个解压当中一个aar,把其中冲突的class/package 删掉,重新打包成AAR进行集成,当然,这种方案网上大批的文章..仅仅这样没有必要来发文章.这里提供一个比较简单的方案,还有这种方案可能遇到的坑.这时候呢,就把这个AAR上传到maven仓库 ,公有还是私有都可以,为什么一定要传仓库呢?,把作者忘记配置的so库排除加上了,还加入了正则,匹配大量的冲突class,可以很方便的进行。转载 2023-07-17 18:05:45 · 743 阅读 · 0 评论 -
完善动态so加载库
以上代码包括实验代码,都能在这里找到SillyBoy作者:Pika链接:https://juejin.cn/post/7227029203656867899来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-07-04 13:28:40 · 123 阅读 · 0 评论 -
JNI 编程上手指南之数组访问
JNI 中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是 JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问 Java 传递给 JNI 层的数组,必须选择合适的 JNI 函数来访问和设置 Java 层的数组对象。构建 JNI 引用类型的数组,它将保存类 elementClass 中的对象。返回 jobjectArray 数组的元素,通常是获取 JNI 引用类型数组元素。返回数组中的元素个数。转载 2023-06-16 10:35:43 · 416 阅读 · 0 评论 -
JNI 编程上手指南之字符串处理
对于小字符串来说,GetStringRegion 和 GetStringUTFRegion 这两对函数是最佳选择,因为缓冲区可以被编译器提前分配,而且永远不会产生内存溢出的异常。当你需要处理一个字符串的一部分时,使用这对函数也是不错。因为它们提供了一个开始索引和子字符串的长度值。另外,复制少量字符串的消耗也是非常小的。使用 GetStringCritical 和 ReleaseStringCritical 这对函数时,必须非常小心。转载 2023-06-15 16:41:13 · 541 阅读 · 0 评论 -
JNI 编程上手指南之描述符
在 JVM 虚拟机中,存储数据类型的名称时,是使用指定的描述符来存储,而不是我们习惯的 int,float 等。即在 C/C++ 中怎么找到 Java 中的类,这就要使用到 JNI 开发中的类描述符了。JNI 提供的函数中有个 FindClass() 就是用来查找 Java 类的,其参数必须放入一个类描述符字符串,类描述符一般是类的完整名称(包名+类名)虽然有类描述符,但是类描述符里并没有说明基本类型和数组类型如何表示,所以在 JNI 中就引入了域描述符的概念。转载 2023-06-13 17:09:07 · 201 阅读 · 0 评论 -
Native Hook 快速上手
Hook 原意是指钩子,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技大家可能比较熟悉 Java 层的一些 Hook 技术,比如反射,动态代理,或者 ASM 字节码插桩在 Java 层之外,Android 系统还有很大一部分属于 Native 层,有时不可避免的需要用到 Native Hook 技术本文主要介绍 Native Hook 是什么,以及如何通过一个例子快速上手。转载 2023-06-05 13:32:20 · 861 阅读 · 0 评论 -
浅谈extractNativeLibs
很早之前逛看雪论坛看到有人提到过一件事:安卓高版本在安装apk时可以不解压lib中的so文件,而将其直接映射到内存中实现加载。当时虽然觉得有必要了解一下这个事情,但是自己并没有碰到这种case所以就搁置了。这不最近连着两次踩到这个坑了,就正好拿出来水一篇文章,这次的关键字是。是AndroidManifest.xml中的一个字段,它的官方描述如下此属性指示软件包安装程序是否将原生库从 APK 提取到文件系统。如果设置为 “false”,则原生库以未压缩的形式存储在 APK 中。转载 2023-06-02 10:15:44 · 1902 阅读 · 0 评论 -
如何阅读 Android 系统源码 —— C/C++ 篇
较新版本的 Android 源码支持使用 AIDEgen 调用 Clion 查看 C/C++ 代码。但是,对于我们学习使用的 Android10 是不支持的。通过 log 信息我们可以知道程序的运行状态和运行过程中的关键参数。通过调用栈我们可以知道函数的执行流程。对于 Android 系统源码中的 C/C++ 代码,CLion 是一个不错的工具。这里我们知道 SurfaceFlinger 定义在。接着我们就可以使用 Clion 打开我们的代码了。这样我们就可以开始调试 C/C++ 代码了。转载 2023-05-29 15:45:27 · 954 阅读 · 0 评论 -
一篇文章教你完全掌握jni技术
通过这样一个简单的案例,将大部分jni相关的API都练习了一遍,不难看出,java层能实现的功能,在native层一样可以实现,但这里仅仅是为了练习jni,实际项目中不会把一些无关紧要的功能写在native层,比如UI操作,因为同样的功能,java代码要简洁得太多。在一些拥有复杂算法的场景(音视频编解码,图像绘制等),java的执行效率远低于C/C++的执行效率,使用jni技术,在java层调用C/C++代码,可以提高程序的执行效率,最大化利用机器的硬件资源。的内容,这个取决于实际的需求。转载 2023-05-10 09:59:44 · 2995 阅读 · 0 评论 -
一文带你再也不惧怕NDK开发,覆盖所有层面
构建层,Java层以及Native层。对每一层都进行了较为详细的讲解,其中构建层主要负责构建配置so文件的配置,而真正做事情的是Native层。最后使用了一个Demo对前面理论进行了实践,真正做到活学活用。纸上得来终觉浅,绝知此事要躬行,多练才能熟能生巧。一文带你再也不惧怕NDK开发,覆盖所有层面~转载 2023-03-20 14:18:45 · 670 阅读 · 0 评论 -
分享两种方式:如何开启JNI的“大门”
前段时间学习OpenGL ES相关技术,下载了一个Github项目学习,项目地址在:项目的关键代码都是C++实现的,所以需要使用JNI技术。我打开定义native方法的java类,如下所示:全部都是红色警告。原因是,C++代码层没有对应的遵循特定JNI格式的JNI函数。其实这个项目没有使用静态注册方法,而是使用了动态注册方法。下面我们分别来讲一下两种方式的区别。2。转载 2023-02-23 16:01:16 · 218 阅读 · 0 评论 -
应用层开发者怎么应对Native Crash
本篇贴出的代码有点少!没事,已经上传到github上啦,mooner如果对你有帮助,请别忘记给我一个star!同时欢迎后续的pr!作者:Pika链接:https://juejin.cn/post/7178341941480783931来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-02-09 10:03:41 · 272 阅读 · 0 评论 -
动态加载so 探索
对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载出转载 2022-12-05 10:49:11 · 183 阅读 · 0 评论 -
JNI 从入门到实践,万字爆肝详解
到这里,JNI 的知识就讲完了,你可以按照学习路线图来看。下一篇,我们开始讲 Android NDK 开发。关注我,带你建立核心竞争力,我们下次见。参考资料《JNI 编程指南》JNI 提示—— Android 官方文档Java 原生接口规范 —— Java 官方文档深入理解 Android:卷 1(第 2 章 · 深入理解 JNI)—— 邓凡平 著深入理解 Android:Java 虚拟机 ART(第 11 章 · ART 中的 JNI)—— 邓凡平 著。转载 2022-10-20 10:34:06 · 2136 阅读 · 0 评论 -
Android NDK学习(六): so文件兼容之abiFilters的使用
为了决定最后适配的abi版本,我下载了排行前几名的app,然后打开之后发现,他们基本上只适配了一个armeabi,少数会再加上v7a。我了解到的情况是armeabi性能较差,但是兼容性最好,v7a对于浮点计算的cpu来说性能更好,不兼容不支持浮点运算的cpu。我想到的是目前的手机cpu绝大多数应该是支持浮点运算的,而且安卓从2.2开始就支持v7a,所以v7a的兼容性应该也不是问题。无论如何,abiFilters还是应该添加的。原文地址httpsAndroidNDK学习(六)...转载 2022-07-28 14:14:30 · 1223 阅读 · 0 评论 -
让Native Crash 与ANR无处发泄
高产似母猪的我,又带来了干货记录,本次是对signal的一个总结与回顾。不知道你们开发中,是否会遇到小部分的nativecrash 或者 anr,这部分往往是由第三方库导致的或者当前版本没办法修复的bug导致的,往往这些难啃的crash,对现有的crash数据指标造成一定影响,同时也对这小部分crash用户不友好,那么我们有没有办法实现一套crash or anr重启机制呢?其实是有的,相信在各个大厂都有一套“安全气囊”装置,比如crash一定次数就启用轻量版本或者自动重新启动等等,下面我们来动手搞一个这样转载 2022-07-08 10:37:13 · 304 阅读 · 0 评论 -
Android动态加载so
对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载出转载 2022-07-06 10:25:08 · 694 阅读 · 0 评论 -
在Android项目中调用FFmpeg命令
概述FFmpeg,命令行非常强大。在PC机上,调用一行FFmpeg命令,就可以对视频文件进行剪切、合并、转码等功能。本文将介绍如何在Android中调用FFmpeg命令行。编译前面已经有两篇文章介绍FFmpeg的编译:Android NDK交叉编译FFmpeg 将FFmpeg编译成一个libffmpeg.so库创建ffmpeg-cmd模块Step1:目录结构Step2:导入libffmpeg.so库在ffmpeg-cmd模块的build.gradle中添加配转载 2021-03-01 15:01:15 · 1903 阅读 · 0 评论 -
用ndk-stack快速定位jni问题
第一步把相关报错日志导入到本地文件Android\sdk\platform-tools>adb logcat > D:\log.txt第二步把上 面的错误日志文件用ndk-stack进行解读准确找到出错的c\c++文件和行数Android\sdk\ndk-bundle\ndk-stack -sym app\build\intermediates\cmake\debug\obj\armeabi-v7a -dump D:\log.txt原文如下所示:...原创 2021-02-15 21:03:38 · 212 阅读 · 0 评论 -
Android录音并实时转成MP3格式
资源点我jni:音频转成MP3格式的C库,将类名或者路径名改成自己项目路径,通过NDK生成so库。mp3library:录音、格式转换的Library,包括so库和工具类。步骤一:下载NDK,并配置(Mac)1.下载地址:http://tools.android-studio.org/2.解压后,配置环境变量export NDK_HOME=/Users/liepin/Library/Android/ndk (改成自己的路径)export PATH=$PATH:$NDK_HOME转载 2021-01-21 14:06:17 · 1605 阅读 · 0 评论 -
c语言 判断文件是否存在
使用access函数功能:检查调用进程是否可以对指定的文件执行某种操作。用法:#include <unistd.h>#include <fcntl.h>int access(const char *pathname, int mode); pathname: 需要测试的文件路径名。 mode: 需要测试的操作模式,可能值是一个或多个R_OK(可读?), W_OK(可写?), X_OK(可执行?) 或 F_OK(文件存在?)组合体。 返回说明:转载 2021-01-15 17:13:32 · 2009 阅读 · 0 评论 -
JNI入门介绍(Android Studio 3.4)
最近入手安卓的开发与学习,就迫不及待的下载了最新版的AS3.4。可是当我开发JNI程序时,却发现网上的方法大多已经过时,所以在此更新一波以做备忘。 环境:Win10 X86 64位 Android Studio 3.4稳定版 1.JNI的作用 jni的全称就是Java Native Interface,就是Java和C/...转载 2021-01-14 23:16:13 · 275 阅读 · 0 评论 -
AndroidStudio编译libmp3lame
第一步下载libmp3lame源码。https://sourceforge.net/projects/lame/files/latest/download第二步:赋值libmp3lame和include目录下的所有的扩展名为c和h的文件到AndroidStudio中。#CMakeLists.txt文件:# 这里指定了CMake的最低版本为3.4.1cmake_minimum_required(VERSION 3.4.1)#该变量为真时会创建完整版本的Makefileset(CMAKE_V转载 2021-01-14 23:00:13 · 335 阅读 · 0 评论 -
Android studio3.0+ 编译Lame库(CMake方式)
最近在学习音视频方面的知识,购买了音视频开发进阶指南,在交叉编译LAME库的时候,书中使用的还是旧版本的编译方式,现在android studio在2.2以后就开始使用CMake的编译方式了,如果您还不了解这种编译方式,可以去查看这个CMake介绍与使用,里面可以大致了解CMake是什么,怎么使用的。接下来就说一下自己在编译LAME库的时候踩的坑,以及正确的编译流程,本人亲测可用。在这里要说的就是,如果你使用的是AndroidStudio 2.2以上的版本,那么只要在创建项目时选择“Include C+转载 2021-01-14 20:08:15 · 412 阅读 · 1 评论 -
Android移植lame库(采用CMake)
貌似许多人都是从lame库开始入门Android NDK开发的,在网上一搜一大堆详细教程。本篇的亮点是采用Google推荐的CMake工具(不是ndk-builder)来移植lame项目。重点写一下与ndk-builder的差异,而非教程。1.CMake是什么?这个是AndroidStudio 2.2以上的版本才可使用的,跟ndk-builder一样是一款原生构建工具。与ndk-builder不同的是,ndk-builder需要用到mk文件,而CMake则使用CMakeLists文件。具体可阅读转载 2021-01-14 20:01:39 · 365 阅读 · 0 评论 -
ndk cmake ‘jni.h‘ file not found 问题解决
最近写ndk代码时报头文件找不到的错报错图如下:解决办法是用cmake引入nkd头文件include_directories(E/work/sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include)#指定CMake构建本地库时所需的最小版本cmake_minimum_required(VERSION 3.4.1)include_directories(E/work/sdk/ndk-b原创 2021-01-14 18:44:53 · 3728 阅读 · 0 评论 -
JNI DETECTED ERROR IN APPLICATION: can‘t call void com.example.myjnidemo.LameUtils.setConvertProgres
报错如下图所示:Jni调用代码如下:void publishJavaProgress(JNIEnv * env, jobject obj, jint progress) { //1.找到java的LameUtils的class com/example/myjnidemo/ jclass clazz = (*env).FindClass("com/example/myjnidemo/LameUtils"); if (clazz == 0) { ...原创 2021-01-10 22:32:46 · 474 阅读 · 0 评论 -
NDK-CPP语言-纯虚函数+函数模版+模版类
布局文件:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_转载 2016-11-14 16:32:21 · 883 阅读 · 0 评论 -
NDK-CPP语言-继承
布局文件:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_转载 2016-11-14 16:25:22 · 604 阅读 · 0 评论 -
NDK-CPP语言-运算符重载
布局文件:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_转载 2016-11-14 16:07:17 · 507 阅读 · 0 评论 -
NDK-JNI语法-数组处理+全局引用+异常处理+缓存策略
package com.tz.ndk;import java.util.Random;public class NDKInterface { // 内容一:数组操作 // Java传递一个数组到C中,C需要对数组进行排序 public native void softArray(int[] intArray); // 在C中产生一个指定大小的数组,返回到Java中 public转载 2016-10-28 14:47:08 · 714 阅读 · 0 评论 -
JNI语法之数据类型和C访问Java属性和方法
Java属性与方法签名列表:java的方法签名可以用javap -s命令来拿到,进入到java项目的bin目录然后执行命令即可,如图所示:java文件:package com.tz.jni;import java.util.Random;import java.util.UUID;public class Test { public String nam转载 2016-10-27 17:15:19 · 535 阅读 · 0 评论 -
NDK-CPP语言-构造函数+New和Delete和Static关键字+对象大小
public class NDKCpp { //1.C++中构造函数 public native void callCppConstruct(); //2.C++中new关键字、delete关键字 public native void callCppNewOrDelete(); //3.C++中static关键字 public native v转载 2016-11-07 15:42:21 · 597 阅读 · 0 评论