NDK开发
文章平均质量分 86
JNI、NDK、C、C++相关Android Native开发知识点
字节卷动
字节卷动 | CSDN博客专家
博客知识包括:Android、ASM、OpenGL、C++、Java、Python、Shell、Jenkins、Gitlab、Git、SVN等相关进阶知识。
展开
-
【我的Android进阶之旅】NDK开发:如何通过一个自定义的编译参数来动态区分是否需要编译指定模块的代码以及是否链接额外的第三方库
因为我3D渲染代码的业务继承自2D渲染的某个接口,而这个接口要给到上层业务侧调用,有可能不需要3D渲染的业务也无意中调到了这个接口,所以得做一个空实现。引入头文件需要动态区分所以我们需要将两个实现都引入到cpp文件中,当然,通过来区分,最终只会引入其中一个。业务调用需要动态区分具体业务,我们也需要通过来区分,最终只会new出一个具体的实现。好啦,具体这两个实现的业务代码我就不展示了。到此,所有的工作都做完了!通过Jenkins编译时候传参给build.gradle文件。原创 2023-04-26 11:36:04 · 474 阅读 · 0 评论 -
【我的Android进阶之旅】NDK开发引入第三方so库(比如assimp和opencv库)常出现的几个问题:missing and no known rule to make it等
引入第三方so库遇到的常见错误:错误一、ninja: error: 'xxx.so', needed by 'yyy.so', missing and no known rule to make it错误二 error: undefined reference to错误三 java.lang.UnsatisfiedLinkError: dlopen failed: library "libassimp.so" not found原创 2022-12-13 11:48:51 · 1825 阅读 · 0 评论 -
【我的Android进阶之旅】NDK开发之C++如何相互转换jstring和char*
最近NDK开发过程中,需要进行`jstring`和`char*` 相互转换,这里记录一下两个转换的函数。原创 2022-11-15 10:46:23 · 1334 阅读 · 0 评论 -
【我的C/C++语言学习进阶之旅】NDK开发运行的时候出现错误signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x940a2e48
信号(signal)机制它其实是进程间通信的一种方式。在处理ndk crash日志的时候可以大概理解为错误码,它描述了错误的大概原因。信号码值描述SIGILL4非法指令,例如损坏的可执行文件或代码区损坏SIGABRT6通过C函数abort()发送;为assert()使用SIGBUS7不存在的物理地址,更多为硬件或系统引起SIGFPE8浮点数运算错误,如除0操作SIGKILL9迅速完全终止进程;不能被捕获SIGSEGV11段地址错误,例如空指针、野指针、数组越界等。原创 2022-09-29 11:43:30 · 1532 阅读 · 0 评论 -
【我的C/C++语言学习进阶之旅】JNI开发之转换C层返回的结构体为Java实体Bean
在我之前的博客介绍了如何传Java对象到C++层代码。今天和算法联调的时候,调用算法返回的结果是一个Struct结构体,然后我需要将将构体转换为Java对象Bean返回给Java业务层,因此记录一下怎么转换的。原创 2022-09-28 21:01:39 · 976 阅读 · 0 评论 -
【我的Android进阶之旅】如何传递android的log日志打印方法给到底层算法c代码去调用?
common.h定义了一个logd函数,用于日志打印* 日志打印函数* @param tag 日志TAG* @param fmt 格式化日志内容* @param ... 格式化日志里面需要替换掉的不定参数common.cpp将logd函数具体实现,最终调用里面的函数来打印日志,这样就可以在Logcat窗口查看到打印出来的日志* 简单打印日志的方法} }原创 2022-09-28 17:59:06 · 735 阅读 · 2 评论 -
【我的OpenGL学习进阶之旅】NDK开发中find_library查找的系统动态库在哪里?
使用NDK开发OpenGLES有一段时间了,今天有个不熟悉NDK的同事问一段CMakeLists的代码是什么意思?forand.,public....,this,-,or..原创 2022-07-15 12:03:23 · 1049 阅读 · 0 评论 -
【我的Android进阶之旅】如何在NDK开发的时候定位Native层的内存泄漏?
最近做一个OpenGL ES项目,使用C++来实现的。在自测阶段,发现内存有泄漏,特别是Native内存泄漏的很明显。然后通过本文所说的方法来动态检测了Native的内存泄漏,最终全部修复完内存泄漏!!!原创 2022-03-18 10:29:10 · 3476 阅读 · 0 评论 -
【我的C/C++语言学习进阶之旅】JNI开发之Java传递实体Bean到C++层,实体Bean包含int、float等基本类型和数组array、List集合等
一、需求描述最近有个需求,Java上层包装一系列的数据到一个实体bean,实体Bean包含int、float等基本类型和数组array、List集合等,然后通过JNI传递给C++层来进行数据处理,这边折腾了一番终于搞定,这里记录一下。1.1 Java实体bean首先,Java层实体bean代码如下:package com.oyp.ndkdemo;import android.graphics.PointF;import java.util.List;public class FaceFe原创 2022-02-25 10:34:20 · 1314 阅读 · 0 评论 -
【我的Android进阶之旅】NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情
一、需求描述在我之前的博客 【我的Android进阶之旅】NDK开发之在C++代码中使用Android Log打印日志,打印内容带有文件文件名、方法名、行号 等信息,方便定位日志输出的地方中,我有介绍如何实现可以打印带有文件名、方法名、行号 等信息的Log日志。现在,我又有新需求:想打印出C++的函数耗时以及代码片段耗时详情,接下来看看怎么做吧。二、实现打印出C++的函数耗时以及代码片段耗时详情在原来的LogUtil.h中,添加如下代码#include <sys/time.h>#d原创 2021-11-26 11:24:16 · 786 阅读 · 0 评论 -
【我的Android进阶之旅】NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp的工作量
一、需求描述之前一篇文章 【我的Android进阶之旅】Android Studio 添加新的.Cpp和.h文件之后,代码不高亮,代码不可跳转的问题,写代码也没有提示写了添加一个新的.cpp和.h文件,因为路径写错了,导致代码不高亮也不可以跳转的问题。后来修复这个问题,发现每次添加一个.cpp和.h文件,我都得配置一遍,很麻烦。而且配置的内容越来越多,看起来很冗余。存在的.cpp和.h 文件需要给.cpp和.h 文件添加的配置要配置这么多,如果后面一直增加,这个配置会越来越多。# Cr原创 2021-11-01 16:39:21 · 1951 阅读 · 0 评论 -
【我的Android进阶之旅】NDK开发之在C++代码中使用Android Log打印日志,打印内容带有文件文件名、方法名、行号 等信息,方便定位日志输出的地方
一、需求描述1.1 原生接口的现状一般,我们在JNI层输出Android Log时,直接使用原生的接口,打印如下:// 实现 C语言中打印log到android控制台// 导入 头文件 android/log.h#include <android/log.h>// 定义一些宏#define DEBUG 1 //日志开关,1为开,其它为关#if(DEBUG==1)// 定义LOG 标签#define LOG_TAG "JNI_LOG_TAG"// 定义几个打印日志的方法/原创 2021-10-27 23:35:31 · 962 阅读 · 0 评论 -
【我的Android进阶之旅】如果通过NDK编程,使用JNI来调用已经封装完毕的无法修改的so库(第三方)
一、需求描述在我的博客【我的Android进阶之旅】如何通过JNI来封装已有的C源码算法,然后让Java层调用C语言写的算法中有介绍,我通过写好Java类,然后生成JNI头文件,再让写算法的同事实现这个JNI头文件,再去调用他已经写好的算法。但是有两个问题得考虑:如果这个C程序员同事就是不配合你咋办?就丢一个已经写好算法的so库给你,其余的你自己去玩。如果你是从其他地方看到一个不错的so文件,但是你没有源码,无法修改,你怎么调用他呢?所以我们得想一想,如果已有的so库文件不会再重新修改源代原创 2021-01-08 20:35:05 · 821 阅读 · 2 评论 -
【我的Android进阶之旅】Android使用JNI的时候报native crash: A/libc: Fatal signal 4 (SIGILL), code 2 (ILL_ILLOPN)
一、问题描述最近在JNI开发中,抛了一个异常,然后运行的时候报如下所示的错误:2021-01-08 14:25:58.170 10974-10974/com.csdn.ouyangpeng.jni D/ouyangpeng-jni-log: hex_sha 6A68B6BDBBB7E79772B2A075A7815537CCA57F6F 2021-01-08 14:25:58.170 10974-10974/com.csdn.ouyangpeng.jni D/ouyangpeng-jni-log:原创 2021-01-08 14:49:15 · 2147 阅读 · 0 评论 -
【我的Android进阶之旅】Android 如何防止 so库文件被未知应用盗用?
首先,关于Android 如何防止 so库文件被未知应用盗用这个话题并不是我擅长的,只是在开发中遇到了这个问题,因此在这里总结一下。故事回到几个月之前,当时公司和第三方音乐平台合作了一款内置于手表系统的音乐APP应用,合作过程中需要第三方提供so库文件来进行相关操作。当时提供so库文件的时候,第三方公司要求我们提供一个我们音乐APP应用的签名文件(这个签名文件称呼为V1)中的MD5码,然后再给我们原创 2017-03-25 18:12:20 · 6208 阅读 · 4 评论 -
【我的Android进阶之旅】如何通过JNI来封装已有的C源码算法,然后让Java层调用C语言写的算法
一、需求描述最近有个需求,需要接入算法同事写的算法。算法同事的算法代码是用C语言写的,然后需要将该算法运用到Android层。然后经过一段时间的开发,算法人员将算法写好了,他们在PC端调试模拟数据,但是如何将他们的算法接入到Android层,他们不会。说白了,他们只懂C语言,其他的都不会。算法人员已经有已经有了下面的两个文件:.h文件(其中包括一些结构体的定义,还有一些方法的声明等等).c文件(里面是对.h文件中一些方法的实现)很显然这里说的.c文件中的函数肯定没有按照那种JNI的规范原创 2020-10-26 21:42:43 · 1423 阅读 · 3 评论 -
【我的Android进阶之旅】Android Studio中JNI开发如何通过Extranal Tools 快速一键生成.h头文件
一、需求描述刚要开发一个JNI的项目,需要生成一些.h的头文件。如何能够快速提供编写好的java文件生成.h头文件呢?二、实现需求2.1 打开File->Setting->Tools->Enternal Tools2.2 新增你的 External Tools如上所示,已经有一个我刚刚新建的名字叫做【JNI】的 External Tools,我们来看下我们新增的这个JNI的内容是什么。我们可以通过点击 +号 按钮,新建一个External Tools。然后我们建一个名字叫原创 2020-10-20 16:38:54 · 797 阅读 · 0 评论 -
【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法
错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误。报错如下所示:11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/art: No implementation found for void com.netease.xtc.cloudmusic.utils.NeteaseMusicUtils.nativeInit(...原创 2016-11-01 17:07:02 · 76702 阅读 · 45 评论 -
【我的Android进阶之旅】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
Android 设备的CPU类型通常称为ABIs问题描述解决方法1解决之前的截图2解决后的截图3解决方法4建议为什么你需要重点关注so文件App中可能出错的地方其他地方也可能出错使用android-21平台版本编译的so文件运行在android-15的设备上混合使用不同C运行时编译的so文件没有为每个支持的CPU架构提供对应的so文件将so文件放在错误的地方只提供arme...原创 2016-04-16 14:46:38 · 103408 阅读 · 24 评论 -
在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口。实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务。我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口如何去访问转载 2013-03-25 12:37:59 · 1196 阅读 · 0 评论 -
JNI 学习笔记
1,先把c语言的编译环境搭建好,windows下这里使用mingw1,mingw具体配置配置环境变量: 打开:“我的电脑->属性->高级->环境变量->系统变量”编辑如下系统变量: 变量名 变量值转载 2013-03-23 00:03:32 · 1615 阅读 · 0 评论 -
JNI学习
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接转载 2013-03-23 00:14:46 · 1603 阅读 · 0 评论