如何使用 ScreenshotClient 在 Android 上获得快速像素颜色?

How get fast pixel color on Android use ScreenshotClient?

我想使用带有参数 x 和 y 的二进制文件获取颜色像素。屏幕截图非常慢。使用虚拟显示也不会给出预期的结果。

我找到并编码 screencap, and good project: sji-android-screen-capture-old and sji-android-screen-capture-new

但是我的 phone 中没有这些解决方案 运行。如果 运行 get-raw-image.cpp 编译后 get-raw-image.cpp 我得到错误:

WARNING: linker: /data/local/tmp/get-raw-image-4.1.2: unused DT entry: type 0xf arg 0x21d
CANNOT LINK EXECUTABLE: cannot locate symbol "_ZN7android16ScreenshotClient6updateERKNS_2spINS_7IBinderEEE".

对于编译,我使用以下设置:

/root/arm/bin/arm-linux-androideabi-clang -pie get-raw-image.cpp -lsupc++ libgui.so -o /get-raw-image-4.1.2 -Xlinker -rpath=/system/lib -DTARGET_JB

如果运行 Android-fast-screen-capture:

/root/arm/bin/arm-linux-androideabi-clang -pie /screen/ascreencap.cpp -o /test -std=c++11

我有错误:

In file included from /screen/ascreencap.cpp:8:
In file included from /root/arm/bin/../sysroot/usr/include/binder/IPCThreadState.h:21:
/root/arm/bin/../sysroot/usr/include/binder/Parcel.h:86:11: error: unknown type
      name 'binder_size_t'
    const binder_size_t* objects() const;
          ^
/root/arm/bin/../sysroot/usr/include/binder/Parcel.h:220:47: error: unknown type
      name 'binder_size_t'
                                        const binder_size_t* objects, si...
                                              ^
/root/arm/bin/../sysroot/usr/include/binder/Parcel.h:228:51: error: unknown type
      name 'binder_size_t'
                                            const binder_size_t* objects...
                                                  ^
/root/arm/bin/../sysroot/usr/include/binder/Parcel.h:264:5: error: unknown type
      name 'binder_size_t'
    binder_size_t*      mObjects;
    ^
In file included from /screen/ascreencap.cpp:8:
/root/arm/bin/../sysroot/usr/include/binder/IPCThreadState.h:114:50: error:
      unknown type name 'binder_size_t'
                                           const binder_size_t* objects...
                                                 ^
5 errors generated.

我也发现了问题how-to-use-screenshotclient-in-my-android-application,但是我不明白如何设置link到ScreenshotClient,这样编译就不会return报错。

我的 phone 是 Homtom HT16:

Processor   : ARMv7 Processor rev 3 (v7l)
processor   : 0
model name  : ARMv7 Processor rev 3 (v7l)
BogoMIPS    : 26.00
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

也许有人会告诉你如何编译我下面的代码phone或者去哪条路解决问题。

我解决了我的问题。

步骤:

1) 从 android phone (libgui.so, libui.so, libcutils.so, libutils.so, libbinder.so).

复制需要的库

2) 在sys_root中添加(当从AndroidAndroid 6_r1库中保存ndk lib代码文件时:utils, cutils, system, log, hardware, system, ports, core, include/gui, include/ui, include/binder)。您可以 运行 此代码找到您的系统根目录:

echo "#include <bogus.h> int main(){}" > t.c; GCC_OR_CLANG_BINARY_LINK -v t.c; rm t.c

错误打印了编译器搜索包含文件的所有路径。 或使用 --sysroot=YOUR_PATH 设置路径。

3) 添加标志 -Wl,--unresolved-symbols=ignore-all 以忽略错误,并添加 --target=armv7-none-linux-androideabi23(23 或其他)以设置目标版本。

完成我的 clang 命令:

/Users/macbookair/Documents/test/bin/clang -fPIE -pie fast-screen-capture.cpp *.so -o ./screencap --target=armv7-none-linux-androideabi23 -Wl,--unresolved-symbols=ignore-all -s

成功!