lldb 安装和调试 Android 程序
最编程
2024-07-18 19:13:49
...
Android Studio自带lldb,安装过程不再赘述。lldb官网https://lldb.llvm.org/use/map.html。
需求
需要获取图片中每一个像素的RGBA值。
代码
Java端代码:
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stringFromJNI(convertImageToBitmap(path));
}
});
public Bitmap convertImageToBitmap(String imagePath) {
BitmapFactory.Options options = new BitmapFactory.Options();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
}
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
return bitmap;
}
native测的代码, 从c++层拿到Java层传递过来的Bitmap。
Java_com_example_myapplication_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */, jobject bmpObj) {
AndroidBitmapInfo info;
int ret;
if ((ret = AndroidBitmap_getInfo(env, bmpObj, &info)) < 0)
{
return NULL;
}
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)
{
return NULL;
}
unsigned char* bitmapPixels;
unsigned char* newBitmapPixels;
//对bitmapPixels的所有操作可直接作用在BitMap上面
if ((ret = AndroidBitmap_lockPixels(env, bmpObj, (void**)&bitmapPixels)) < 0)
{
return NULL;
}
getRGBA(bitmapPixels, info.width, info.height);
AndroidBitmap_unlockPixels(env, bmpObj);
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
bitmapPixels数组的长度是所有像素点个数 * 4。为什么是乘以4,是因为rgba是四个值,这个数组从0开始每隔4个就是一个像素点的r/g/b/a值。所以数组的第0,1,2,3个值分别代表第一个像素点的r,g,b,a的值。从左到右,从上到下。
int getRGBA(unsigned char* ucImageData, int nWidth, int nHeight){
if (ucImageData == NULL || file == NULL) {
return 1;
}
int nChannel = 4;
int nStep = nWidth * nChannel;
for (int y = 0; y < nHeight; y++){
for (int x = 0; x < nWidth; x++)
{
float r = (ucImageData[y * nStep + x * nChannel + 0]);
float g = (ucImageData[y * nStep + x * nChannel + 1]);
float b = (ucImageData[y * nStep + x * nChannel + 2]);
float a = (ucImageData[y * nStep + x * nChannel + 3]);
}
}
return 0;
}
另一种常见的写法:
int getRGBA(unsigned char* ucImageData, int nWidth, int nHeight){
if (ucImageData == NULL || file == NULL) {
return 1;
}
int nChannel = 4;
int nStep = nWidth * nChannel;
for (int y = 0; y < nHeight; y++){
for (int x = 0; x < nWidth; x++)
{
float r = (ucImageData[(y * width + x) * 4 + 0]);
float g = (ucImageData[(y * width + x) * 4 + 1]);
float b = (ucImageData[(y * width + x) * 4 + 2]);
float a = (ucImageData[(y * width + x) * 4 + 3]);
}
}
return 0;
}
lldb命令
查看Disassemble
(lldb) disassemble --name main
(lldb) di -n main
查看寄存器
register read rax rsp rbp
查看局部变量
(lldb) frame variable
(lldb) fr v
查看调用堆栈
(lldb) thread backtrace all
(lldb) bt all
查看内存
(lldb) memory read --size 4 --format x --count 4 0xbffff3c0
(lldb) me r -s4 -fx -c4 0xbffff3c0
(lldb) x -s4 -fx -c4 0xbffff3c0
还有许多其他操作,比如修改值,单步调试等,这个都可以通过Android Studio进行手动操作,不再赘述。
Android Studio的 Evaluate Expression功能
参考
canvas - 使用getImageData()方法获取canvas的每一个像素点的rgba值。以及如何提取该像素点的rgba值。
GDB to LLDB command map
公众号
更多内容,欢迎关注我的微信公众号:半夏之夜的无情剑客。
推荐阅读
-
消除奇怪的前端错误:1 比特损失导致音频/视频播放时间无限增长 - Http 分路传输的核心分析和坑洞 - 调试程序
-
手机上的Android应用程序,用于制作立体柱状图和三维图形
-
在Android Studio中,小米手机真机调试遇到安装失败问题:INSTALL_FAILED_USER_RESTRICTED的解决方案探索
-
简易讲解:如何一步步安装与设置Android调试桥(adb)
-
在Windows和Mac电脑上快速设置Android ADB(调试桥)指南
-
如何在MAC电脑上安装Android调试工具(ADB) for MAC OS X
-
如何在MAC电脑上安装Android调试工具(ADB) for MAC OS X
-
简易教程:在Android模拟器或真实设备上安装和管理CA证书" 步骤指南: 1. 打开命令提示符并启动ADB 2. 挂载设备硬盘以便访问 3. 寻找并导航至存储CA证书的文件夹 - 确认证书是否已存在于该文件夹内 - 复制证书名称及其完整路径 4. 从设备中获取证书内容到本地电脑 5. 如果本地已有相同CA证书,则跳过前四步,直接进行下一步 6. 将电脑上的CA证书通过ADB推送至设备系统中 具体操作命令如下:(省略)
-
LLDB 调试 Android 本地程序
-
LLDB 原理和调试实践