
jni
文章平均质量分 79
锐湃
这个作者很懒,什么都没留下…
展开
-
Native层崩溃的监听工具BreakPad
做Android开发的同学,基本上都遇到过程序崩溃,大部分的崩溃问题都存在于Java层。在开发过程中,如果遇到崩溃,我们可以在logcat中找到相关的信息进行修改;如果是线上出现的问题,我们可以使用Bugly,友盟等三方工具进行错误上报,或者自己做监控,生成错误文件进行上报分析,这时候需要用到UncaughtExceptionHandler接口如果是Native层发生的崩溃怎么办?基本这个问题我们都会略过,第一:看不懂,第二:三方的so库发生了问题我们也解决不了。转载 2025-03-19 18:44:31 · 115 阅读 · 0 评论 -
深入探索JNI:基础、最佳实践、性能优化与安全策略
Java Native Interface(JNI)是一个强大的机制,允许Java代码与其他语言编写的应用程序或库(主要是C和C++)进行交互。这种能力极大地扩展了Java的应用范围,使得可以在Java平台上执行高性能计算或调用系统级API。然而,正确和高效地使用JNI不仅需要对其机制有深入的理解,还需要关注安全性和性能优化。本文将全面介绍JNI的基础知识,并提供实用的最佳实践、性能优化技巧和安全策略。转载 2024-11-04 21:20:13 · 191 阅读 · 0 评论 -
NDK开发、Native Hook、Android性能优化必知:动态链接
本文主要介绍了为什么要使用动态链接,动态链接中的装载时重定位与地址无关代码技术的使用,Elf 文件中动态链接的结构,以及动态链接的步骤和实现等内容。动态链接中的 .got,.got.plt 表,运行时加载等内容是掌握 Native Hook 技术的基础,在 Android 性能优化中非常常用。NDK开发、Native Hook、Android性能优化必知:动态链接。转载 2024-06-11 11:09:54 · 127 阅读 · 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 · 294 阅读 · 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 · 5947 阅读 · 1 评论 -
JNI FindClass 遇到的 NoClassDefFoundError 错误
虽然解决了 boot classLoader 加载应用类的问题,但还有一个问题需要解决,那就是调用 Java 方法之后可能会造成的循环调用问题,这里需要做一些类、方法的排除。jvmti demo 示例可查看 jvmticheck.cpp[4]转载 2024-02-20 11:20:33 · 451 阅读 · 0 评论 -
分析so文件和依赖的关系
在包大小的占比中,so文件的占比往往是最高的,动辄几兆的大小多一个都会把包大小的指标打爆。而在各厂商要求对手机CPU ARM架构进行分包适配的情况下,你更需要知道哪些依赖是没有适配v7a/v8a的,这将影响你的APP在应用市场的审核。所以搞清楚so文件和依赖的关系,它不仅是一个技术指标归因的工具,也是应对厂商分包适配的利器。转载 2023-11-01 14:58:45 · 815 阅读 · 0 评论 -
JNI函数 Hook实战
上面所以讲到的内容,我都已经开源了,JniHook,希望这个库能够帮助开发者更加简单的去用上jni hook。如果对你有帮助,还请留下你的star噢!转载 2023-09-19 10:34:51 · 694 阅读 · 0 评论 -
完善动态so加载库
以上代码包括实验代码,都能在这里找到SillyBoy作者:Pika链接:https://juejin.cn/post/7227029203656867899来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-07-04 13:28:40 · 211 阅读 · 0 评论 -
JNI 编程上手指南之数组访问
JNI 中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是 JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问 Java 传递给 JNI 层的数组,必须选择合适的 JNI 函数来访问和设置 Java 层的数组对象。构建 JNI 引用类型的数组,它将保存类 elementClass 中的对象。返回 jobjectArray 数组的元素,通常是获取 JNI 引用类型数组元素。返回数组中的元素个数。转载 2023-06-16 10:35:43 · 474 阅读 · 0 评论 -
JNI 编程上手指南之字符串处理
对于小字符串来说,GetStringRegion 和 GetStringUTFRegion 这两对函数是最佳选择,因为缓冲区可以被编译器提前分配,而且永远不会产生内存溢出的异常。当你需要处理一个字符串的一部分时,使用这对函数也是不错。因为它们提供了一个开始索引和子字符串的长度值。另外,复制少量字符串的消耗也是非常小的。使用 GetStringCritical 和 ReleaseStringCritical 这对函数时,必须非常小心。转载 2023-06-15 16:41:13 · 691 阅读 · 0 评论 -
JNI 编程上手指南之描述符
在 JVM 虚拟机中,存储数据类型的名称时,是使用指定的描述符来存储,而不是我们习惯的 int,float 等。即在 C/C++ 中怎么找到 Java 中的类,这就要使用到 JNI 开发中的类描述符了。JNI 提供的函数中有个 FindClass() 就是用来查找 Java 类的,其参数必须放入一个类描述符字符串,类描述符一般是类的完整名称(包名+类名)虽然有类描述符,但是类描述符里并没有说明基本类型和数组类型如何表示,所以在 JNI 中就引入了域描述符的概念。转载 2023-06-13 17:09:07 · 241 阅读 · 0 评论 -
Native Hook 快速上手
Hook 原意是指钩子,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技大家可能比较熟悉 Java 层的一些 Hook 技术,比如反射,动态代理,或者 ASM 字节码插桩在 Java 层之外,Android 系统还有很大一部分属于 Native 层,有时不可避免的需要用到 Native Hook 技术本文主要介绍 Native Hook 是什么,以及如何通过一个例子快速上手。转载 2023-06-05 13:32:20 · 1084 阅读 · 0 评论 -
一篇文章教你完全掌握jni技术
通过这样一个简单的案例,将大部分jni相关的API都练习了一遍,不难看出,java层能实现的功能,在native层一样可以实现,但这里仅仅是为了练习jni,实际项目中不会把一些无关紧要的功能写在native层,比如UI操作,因为同样的功能,java代码要简洁得太多。在一些拥有复杂算法的场景(音视频编解码,图像绘制等),java的执行效率远低于C/C++的执行效率,使用jni技术,在java层调用C/C++代码,可以提高程序的执行效率,最大化利用机器的硬件资源。的内容,这个取决于实际的需求。转载 2023-05-10 09:59:44 · 3187 阅读 · 0 评论 -
一文带你再也不惧怕NDK开发,覆盖所有层面
构建层,Java层以及Native层。对每一层都进行了较为详细的讲解,其中构建层主要负责构建配置so文件的配置,而真正做事情的是Native层。最后使用了一个Demo对前面理论进行了实践,真正做到活学活用。纸上得来终觉浅,绝知此事要躬行,多练才能熟能生巧。一文带你再也不惧怕NDK开发,覆盖所有层面~转载 2023-03-20 14:18:45 · 761 阅读 · 0 评论 -
分享两种方式:如何开启JNI的“大门”
前段时间学习OpenGL ES相关技术,下载了一个Github项目学习,项目地址在:项目的关键代码都是C++实现的,所以需要使用JNI技术。我打开定义native方法的java类,如下所示:全部都是红色警告。原因是,C++代码层没有对应的遵循特定JNI格式的JNI函数。其实这个项目没有使用静态注册方法,而是使用了动态注册方法。下面我们分别来讲一下两种方式的区别。2。转载 2023-02-23 16:01:16 · 280 阅读 · 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 · 2446 阅读 · 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 · 1330 阅读 · 0 评论 -
让Native Crash 与ANR无处发泄
高产似母猪的我,又带来了干货记录,本次是对signal的一个总结与回顾。不知道你们开发中,是否会遇到小部分的nativecrash 或者 anr,这部分往往是由第三方库导致的或者当前版本没办法修复的bug导致的,往往这些难啃的crash,对现有的crash数据指标造成一定影响,同时也对这小部分crash用户不友好,那么我们有没有办法实现一套crash or anr重启机制呢?其实是有的,相信在各个大厂都有一套“安全气囊”装置,比如crash一定次数就启用轻量版本或者自动重新启动等等,下面我们来动手搞一个这样转载 2022-07-08 10:37:13 · 366 阅读 · 0 评论 -
Android动态加载so
对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载出转载 2022-07-06 10:25:08 · 781 阅读 · 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 · 247 阅读 · 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 · 1722 阅读 · 0 评论 -
jni拼接字符串
/** * 字符串拼接 * @param env * @param cstr * @param jstr * @return */jstring jstrCat(JNIEnv *env,char * cstr,jstring jstr){ char *c =(char *)(*env).GetStringUTFChars(jstr,JNI_FALSE); char * bf = new char[strlen(cstr) + strlen(c) +1]; memcpy.原创 2021-01-18 23:35:55 · 390 阅读 · 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 · 2048 阅读 · 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 · 308 阅读 · 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 · 393 阅读 · 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 · 447 阅读 · 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 · 408 阅读 · 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 · 3956 阅读 · 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 · 563 阅读 · 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 · 529 阅读 · 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 · 746 阅读 · 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 · 559 阅读 · 0 评论 -
JNI初试牛刀
1、建一个java工程取名JniDemo,并新建一个类JniDemo,类里定义native方法,代码如下:package com.jni.demo;import java.io.ObjectInputStream.GetField;public class JniDemo { public native String getJniStr(); static{原创 2016-10-27 12:02:18 · 417 阅读 · 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 · 620 阅读 · 0 评论 -
NDK_CPP语言-构造函数+析构函数+拷贝函数
public class NDKCppInterface { //1.C++中构造函数 public native void executeCppCustruct(); //2.C++中析构函数 public native void executeCppDesctruct(); //3.C++中拷贝函数和赋值运算 public native v转载 2016-11-07 15:20:02 · 1045 阅读 · 0 评论 -
NDK-CPP语言-指针引用+函数指针+函数重载
public class NDKCInterface { public native void executeCConst();}public class NDKCppInterface { //1.学习C++中的常量(包括和C中的常量的区别) public native void executeCppConst(); //2.C++指针的引用转载 2016-11-07 15:07:42 · 1234 阅读 · 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 · 621 阅读 · 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 · 913 阅读 · 0 评论 -
NDK-CPP语言-模版类运算符重载+模版类static关键字+类型转换
布局文件:<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:45:39 · 651 阅读 · 0 评论