如何使用 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
成功!
我想使用带有参数 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
成功!