假装在香港


  • 首页

  • 归档

  • 标签

动态库中使用 C++ 直接将 ARGB 数据写入 App 的 Java int 数组中

发表于 2020-06-30

需求

我们的 YUV 超级夜景算法的输出是 YUV 数据,客户由于要在结果图上绘制水印,需要我们给他们输出 ARGB_8888 的数据。

分析

YUV 数据在 Java 中可以直接通过公式计算转换为 ARGB 数据,但是由于用了多个循环,效率会比较低,在客户的平台 Qualcomm MSM6125 上 12M 的图大概需要用 400ms。400ms 对于 2.5s 的算法耗时来说算得上庞然大物了。所以得想一下其他思路来解决这个问题。

阅读全文 »

反汇编 libc.so 来分析 memcpy 导致的 crash

发表于 2020-04-22

问题

客户反馈了一个 SDK 的 crash log,跑 monkey testing 报出来的问题。trace 信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
04-16 23:58:41.861 18741 18741 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x7740a1d000
04-16 23:58:41.861 18741 18741 F DEBUG : x0 0000007740a1d000 x1 0000007791aa9d40 x2 0000000000f30000 x3 0000007740a1d000
04-16 23:58:41.861 18741 18741 F DEBUG : x4 00000077929d9d40 x5 000000774194d000 x6 0707070808080808 x7 0808080808080707
04-16 23:58:41.861 18741 18741 F DEBUG : x8 0000000000f30000 x9 0000000000000000 x10 0000000042ffc000 x11 0000000000f30000
04-16 23:58:41.861 18741 18741 F DEBUG : x12 0909090909090909 x13 0807080708070809 x14 0000000000000d80 x15 0000000000001200
04-16 23:58:41.861 18741 18741 F DEBUG : x16 000000785d698418 x17 00000078f2ad4380 x18 0000000000000076 x19 0000007853f80878
04-16 23:58:41.861 18741 18741 F DEBUG : x20 0000007853f804d0 x21 0000007740a1d000 x22 0000007791aa9d40 x23 0000000000001200
04-16 23:58:41.861 18741 18741 F DEBUG : x24 0000007853f8d020 x25 00000078156b0f80 x26 0000007853f80878 x27 000000780e20d1f0
04-16 23:58:41.861 18741 18741 F DEBUG : x28 0000000026deaf4d x29 0000007853f807d0
04-16 23:58:41.861 18741 18741 F DEBUG : sp 0000007853f801f0 lr 000000785ce7b90c pc 00000078f2ad4308
04-16 23:58:41.884 18741 18741 F DEBUG :
04-16 23:58:41.884 18741 18741 F DEBUG : backtrace:
04-16 23:58:41.884 18741 18741 F DEBUG : #00 pc 000000000007f308 /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+248) (BuildId: bf43d263cea44574bf5be4629e4f0a8f)
04-16 23:58:41.884 18741 18741 F DEBUG : #01 pc 000000000007b908 /vendor/lib64/libanc_nightshot.so (BuildId: eefc88116d665da17ed0d5d62b2403d72474a995)
04-16 23:58:41.884 18741 18741 F DEBUG : #02 pc 0000000000004e80 /vendor/lib64/camera/components/com.anc.node.nightshot.so (NightShotNodeProcRequest(ChiNodeProcessRequestInfo*)+1992) (BuildId: a999c7381a9344a26858c43375292779)
04-16 23:58:41.884 18741 18741 F DEBUG : #03 pc 00000000006d4020 /vendor/lib64/hw/camera.qcom.so (CamX::ChiNodeWrapper::ExecuteProcessRequest(CamX::ExecuteProcessRequestData*)+2640) (BuildId: cfa7472586f48d4f52f2b5d0d8629b60)
04-16 23:58:41.884 18741 18741 F DEBUG : #04 pc 000000000073d730 /vendor/lib64/hw/camera.qcom.so (CamX::Node::ProcessRequest(CamX::NodeProcessRequestData*, unsigned long)+9832) (BuildId: cfa7472586f48d4f52f2b5d0d8629b60)
04-16 23:58:41.884 18741 18741 F DEBUG : #05 pc 00000000006def80 /vendor/lib64/hw/camera.qcom.so (CamX::DeferredRequestQueue::DeferredWorkerWrapper(void*)+368) (BuildId: cfa7472586f48d4f52f2b5d0d8629b60)
04-16 23:58:41.884 18741 18741 F DEBUG : #06 pc 0000000000636a18 /vendor/lib64/hw/camera.qcom.so (CamX::ThreadCore::WorkerThreadBody(void*)+1992) (BuildId: cfa7472586f48d4f52f2b5d0d8629b60)
04-16 23:58:41.884 18741 18741 F DEBUG : #07 pc 00000000000e6b60 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: bf43d263cea44574bf5be4629e4f0a8f)
04-16 23:58:41.884 18741 18741 F DEBUG : #08 pc 0000000000084b6c /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: bf43d263cea44574bf5be4629e4f0a8f)

阅读全文 »

ByteBuffer 中的字节对齐

发表于 2020-03-12

先说结论

当在 Java 代码中使用 ByteBuffer.allocateDirect 分配内存,并在 JNI 中使用 GetDirectBufferAddress 来获取内存做一些操作后。最后在 Java 代码中操作 byte[] 数据的时候,不要使用 ByteBuffer.array() 来获取数据,而应该使用 ByteBuffer.get() 函数。

阅读全文 »

App 如何获取不同 ev 输入

发表于 2020-02-29

需求

YUV 夜景这类 HDR 效果的 SDK,需要不同 EV (Exposure Value)的输入。

阅读全文 »

《Effective C++》 第四章「设计与声明」学习笔记

发表于 2019-05-28

条款18:让接口容易被正确使用,不易被误用

欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误。

阅读全文 »

我们这群人有种心病,只有金子能医

发表于 2019-02-03

本文是对 2018 年读书的一个总结,写这篇文章的时候正读完「人类简史」这本书,「人类简史」非常棒,读的过程中和读完后都思绪万千,特别想写点东西。今天正值除夕的前一天,此刻我正在回家的动车上,趁着想写东西的这股劲,对去年读过的书做一个总结。

阅读全文 »

在 Gradle 中使用 cppFlags

发表于 2019-01-27

在 build.gradle 的 defaultConfig - externalNativeBuild - cmake 下有一个 cppFlags 的配置项。它的作用是定义 C++ 编译时的 flags:

1
2
3
4
5
6
7
8
9
10
11
12
android {
// Similar to other properties in the defaultConfig block, you can override
// these properties for each product flavor in your build configuration.
defaultConfig {
externalNativeBuild {
cmake {
// Sets optional flags for the C++ compiler.
cppFlags "-fexceptions", "-frtti"
}
}
}
}
阅读全文 »

从 SurfaceView 获取 Bitmap

发表于 2018-12-20

在做三摄算法集成项目的时候,因为手机有三个摄像头,所以存在两种不同的双摄人像模式,分别是 1 倍人像模式(以下简称 1x)和 2 倍光变人像模式(以下简称 2x)。我们没有在 App 层面使用同时打开两个 camera id 的方式来打开双摄,因为这样逻辑会稍微复杂,所以我们是在底层做了这件事,在上层我们只需要打开新增的 camera id,就可以同时打开两个摄像头。

阅读全文 »

在 Android 中使用 ThreadPoolExecutor

发表于 2018-04-03

「阿里巴巴 Android 开发手册」中第 5.3 节对新建线程做了如下强制性要求:

新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。

并对此做了如下的说明:

使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。另外创建匿名线程不便于后续的资源使用分析,对性能分析等会造成困扰。

嗯,有理有据,让人信服。接下来将介绍 Thread Pools, Thread Pool Executors 以及它们在 Android 中的使用。

阅读全文 »

两个栈实现一个队列

发表于 2018-03-13

之前面试的时候被面试官问到一道算法题:如何用两个栈实现一个队列。我的回答是,把所有元素:入第一个栈 -> 从第一个栈出栈并入第二个栈 -> 从第二个栈出栈。当时无知,以为自己的回答是正确的,但是面试官接下来的问题便把我给打回原形了:如果想要队列是可以同时入队列和出队列的呢。

最近在学习《算法导论》,学习到了栈和队列这一章,又想起了上面的问题,便重新思考和 Coding 了一番,顺便记录一下。

阅读全文 »
12
Zhiwei Li

Zhiwei Li

Stay hungry, Stay foolish.

12 日志
5 分类
6 标签
GitHub Weibo E-Mail
© 2020 Zhiwei Li
由 Hexo 强力驱动
主题 - NexT.Pisces