
C
文章平均质量分 81
锐湃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Native层崩溃的监听工具BreakPad
做Android开发的同学,基本上都遇到过程序崩溃,大部分的崩溃问题都存在于Java层。在开发过程中,如果遇到崩溃,我们可以在logcat中找到相关的信息进行修改;如果是线上出现的问题,我们可以使用Bugly,友盟等三方工具进行错误上报,或者自己做监控,生成错误文件进行上报分析,这时候需要用到UncaughtExceptionHandler接口如果是Native层发生的崩溃怎么办?基本这个问题我们都会略过,第一:看不懂,第二:三方的so库发生了问题我们也解决不了。转载 2025-03-19 18:44:31 · 210 阅读 · 0 评论 -
深入探索JNI:基础、最佳实践、性能优化与安全策略
Java Native Interface(JNI)是一个强大的机制,允许Java代码与其他语言编写的应用程序或库(主要是C和C++)进行交互。这种能力极大地扩展了Java的应用范围,使得可以在Java平台上执行高性能计算或调用系统级API。然而,正确和高效地使用JNI不仅需要对其机制有深入的理解,还需要关注安全性和性能优化。本文将全面介绍JNI的基础知识,并提供实用的最佳实践、性能优化技巧和安全策略。转载 2024-10-17 11:10:30 · 168 阅读 · 0 评论 -
NDK开发、Native Hook、Android性能优化必知:动态链接
本文主要介绍了为什么要使用动态链接,动态链接中的装载时重定位与地址无关代码技术的使用,Elf 文件中动态链接的结构,以及动态链接的步骤和实现等内容。动态链接中的 .got,.got.plt 表,运行时加载等内容是掌握 Native Hook 技术的基础,在 Android 性能优化中非常常用。NDK开发、Native Hook、Android性能优化必知:动态链接。转载 2024-06-11 11:09:54 · 171 阅读 · 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 · 419 阅读 · 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 · 6630 阅读 · 1 评论 -
完善动态so加载库
以上代码包括实验代码,都能在这里找到SillyBoy作者:Pika链接:https://juejin.cn/post/7227029203656867899来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-07-04 13:28:40 · 247 阅读 · 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 · 1206 阅读 · 0 评论 -
一篇文章教你完全掌握jni技术
通过这样一个简单的案例,将大部分jni相关的API都练习了一遍,不难看出,java层能实现的功能,在native层一样可以实现,但这里仅仅是为了练习jni,实际项目中不会把一些无关紧要的功能写在native层,比如UI操作,因为同样的功能,java代码要简洁得太多。在一些拥有复杂算法的场景(音视频编解码,图像绘制等),java的执行效率远低于C/C++的执行效率,使用jni技术,在java层调用C/C++代码,可以提高程序的执行效率,最大化利用机器的硬件资源。的内容,这个取决于实际的需求。转载 2023-05-10 09:59:44 · 3229 阅读 · 0 评论 -
Android在c层快速发送广播
2、在c层创建一个文件,在framework层的PhoneWindowManager.java中增加一个FileObersver监听文件状态,在OnEvent方法中发出广播。广播是我们常用的一种通信方式。但是广播是java层方法,在c层不能直接调用。如果需要通过在c层触发广播的发送,怎么去实现呢。版权声明:本文为优快云博主「一块冬瓜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。这种方式最简单,但是shell命名执行时间略长,一般需要500ms以上的时间。转载 2023-04-27 15:06:13 · 733 阅读 · 0 评论 -
一文带你再也不惧怕NDK开发,覆盖所有层面
构建层,Java层以及Native层。对每一层都进行了较为详细的讲解,其中构建层主要负责构建配置so文件的配置,而真正做事情的是Native层。最后使用了一个Demo对前面理论进行了实践,真正做到活学活用。纸上得来终觉浅,绝知此事要躬行,多练才能熟能生巧。一文带你再也不惧怕NDK开发,覆盖所有层面~转载 2023-03-20 14:18:45 · 832 阅读 · 0 评论 -
应用层开发者怎么应对Native Crash
本篇贴出的代码有点少!没事,已经上传到github上啦,mooner如果对你有帮助,请别忘记给我一个star!同时欢迎后续的pr!作者:Pika链接:https://juejin.cn/post/7178341941480783931来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-02-09 10:03:41 · 371 阅读 · 0 评论 -
动态加载so 探索
对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载出转载 2022-12-05 10:49:11 · 275 阅读 · 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 · 2605 阅读 · 0 评论 -
Android动态加载so
对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载出转载 2022-07-06 10:25:08 · 814 阅读 · 0 评论 -
C/C++拼接字符串
char buf[2048] = {}; sprintf(buf, "this is a %s file ,and is a %s.一个 %s \n", "c/c++","test","测试程序"); printf(buf,NULL);运行结果如下:this is a c/c++ file ,and is a test.一个 测试程序 this is a c/c++ file ,and is a test.一个 测试程序...原创 2021-01-18 23:12:50 · 299 阅读 · 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 · 2056 阅读 · 0 评论 -
NDK-CPP语言-string字符串+vector容器+deque双向队列
com_tz_ndk_cpp_NDKCpp.h/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_tz_ndk_cpp_NDKCpp */#ifndef _Included_com_tz_ndk_cpp_NDKCpp#define _Included_com转载 2016-11-22 15:45:59 · 607 阅读 · 0 评论 -
NDK-CPP语言-queue队列+stack栈+list+set+map
com_tz_ndk_cpp_NDKCpp.h/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_tz_ndk_cpp_NDKCpp */#ifndef _Included_com_tz_ndk_cpp_NDKCpp#define _Included_com_tz_转载 2016-11-22 15:56:20 · 1384 阅读 · 0 评论 -
NDK-CPP语言-函数对象+谓词+函数绑定
com_tz_ndk_cpp_NDKCpp.h/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_tz_ndk_cpp_NDKCpp */#ifndef _Included_com_tz_ndk_cpp_NDKCpp#define _Included_com_tz_转载 2016-11-28 14:11:36 · 368 阅读 · 0 评论 -
NDK-CPP语言-常用算法及综合案例
com_tz_ndk_cpp_NDKCpp.h/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_tz_ndk_cpp_NDKCpp */#ifndef _Included_com_tz_ndk_cpp_NDKCpp#define _Included_com_tz_转载 2016-11-28 14:19:25 · 603 阅读 · 0 评论 -
C语言-字符串函数案例
#define _CRT_SECURE_NO_WARNINGS#include #include //1、在C语言里面如何存储字符串?//在Java中有String类型(C++有)/*int main(){ printf("Hello world!\n"); //方式一: //char c[] = {'D','r','e','a','m'}; //方转载 2016-10-25 11:01:23 · 800 阅读 · 0 评论 -
NDK-CPP语言-异常处理+IO流
#include #include // using namespace std;//2.C++语言:异常处理//2.1.C++语言:异常处理-语法-方法内部处理异常// int main(){// //规定性别0和1(0代表男,1代表女)// int sex = 0;// //规定0-200// int age = -300;//转载 2016-11-22 15:39:27 · 657 阅读 · 0 评论 -
c++类型转换
//// Created by Dream on 2016/11/12.//#include #include #include "com_tz_ndk_cpp_NDKCpp.h"using namespace std;//1.C++语言:模版类中重载运算符//#include "Company.cpp"//#include "Student.hpp"//#includ转载 2016-11-22 15:36:31 · 1240 阅读 · 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 · 1090 阅读 · 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 · 1250 阅读 · 0 评论 -
JNI之——Can't load IA 32-bit .dll on a AMD 64-bit platform错误的解决
在JNI开发中,Java程序需要调用操作系统动态链接库时,报错信息:Can't load IA 32-bit .dll on a AMD 64-bit platform。这是由于你的版本是Windows 64位,而你用VS生成的DDL是32位。因此只需要编译生成一个64位的DDL动态链接库就行。具体步骤如下: 1.新建项目选择win32项目 语言C++,输入项目名称"Utils转载 2016-10-26 15:41:35 · 2930 阅读 · 2 评论 -
C语言文件操作
#include #include #include //内容一:读取文件-文本文件// int main(){// //文件的路径// //Windows下:F:\\test.txt// //Mac下:/Users/yangshaohong/Desktop/test.txt// char file_path[] = "/Users/yangsha转载 2016-10-25 11:10:46 · 451 阅读 · 0 评论 -
C语言-结构体+联合体+枚举
#include #include #include //1、结构体:是一种构造数据类型//结构体的用途:把不同的数据类型整合起来,成为一个自定义的数据类型//1.1 定义一个结构体(定义结构体的关键字:struct)//联想到Java中的类// struct User{// //年龄// int age;// //用户名// char n转载 2016-10-25 11:07:40 · 972 阅读 · 0 评论 -
C语言常见的字符串处理函数
函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source);程序例: #include #include int main(void){ char string[10]; char *str1 = "abcdefghi"; stpcpy(string, st转载 2016-10-25 10:55:20 · 386 阅读 · 0 评论 -
c语言基本类型和指针
//导入标准函数库(类似于java的导包)#include //导入标准函数库(system、sizeof等等......)#include //windows系统的api#include /*void main(){ //输出函数 printf("hello world!"); //这是一个命令(在window里面特有的) system("pause");}*//转载 2016-10-13 10:37:36 · 1211 阅读 · 0 评论 -
指针-指针运算
#include #include //1、指针和地址有什么区别?//指针:指针有类型 地址:没有类型,需要强制类型转换才能够赋值给指针变量//int* p = (int *)0x44fc28;//2、空指针//注意:指针使用之前必须要有初始值(初始化)/*void main(){ int* p; printf("%#x",p);}*///补充:/*void转载 2016-10-13 10:14:14 · 375 阅读 · 0 评论 -
eclipse for c++程序调试中的问题:cannot open output file study.exe: Permission denied
好不容易配置好了cdt+mingw等,终于可以写程序了,却发现调试时经常遇到cannot open output file study.exe: Permission denied的问题查找了一些资料发现原因很简单,我在调试结束时没有终止调试(有个红色的方形按钮),所以后来再调试的时候,就会出现这种情况。而且此进程也杀不死。 下次记得关闭调试,也就是点击红色的方形按钮。转载 2016-10-10 15:04:40 · 1931 阅读 · 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 · 632 阅读 · 0 评论 -
C语言-函数指针+动态内存分配
//允许使用过时的函数和不安全的函数,去掉警告#define _CRT_SECURE_NO_WARNINGS#include #include //1、函数指针/*void showMessage(){ //弹窗 MessageBox(0, "消息内容", "消息标题", 0);}double add(double a, double b){ return a + b;转载 2016-10-17 11:23:52 · 1253 阅读 · 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 · 661 阅读 · 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 · 927 阅读 · 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 · 626 阅读 · 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 · 542 阅读 · 0 评论 -
c/c++ POSIX线程和define指令
//POSIX:一套标准(线程一套标准 Java线程底层实现就是基于这套标准等等....)//类似于Java中如何使用线程//在C语言中如何使用线程?#include #include //需要引入线程头文件#include void* get_min(){ for(int i = 0;i<10;i++){ printf("i = %d\n",i);转载 2016-10-31 14:06:31 · 528 阅读 · 0 评论 -
Android官方开发文档Training系列课程中文版:Android的JNI相关
原文地址:http://android.xsoftlab.net/training/articles/perf-jni.htmlJNI的全称为Java Native Interface,中文意思是Java本地接口。它定义了Java代码与C/C++代码之间的交互方式。它是两者的桥梁,支持从动态共享库中加载代码。虽然有些复杂,但是它的执行效率还是蛮高的。如果你对JNI还不太熟悉,那么可转载 2016-10-20 17:07:44 · 347 阅读 · 0 评论