大家好,我看了这篇 http://blog.csdn.net/zmyde2010/article/details/6925498 博文之后,想要在android4.0.3系统也实现用android源码截屏。我下载android源码,编译,并单独编译jni模块。编译成功了,但是运行时出错,Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)。通过无穷无尽的查资料,发现此问题有可能是想库文件的函数中传递空指针造成的。顺着这个思路研究,看log发现是在cpp文件中调用完composer->captureScreen函数后发现其返回值为NO_ERROR,但是heap却是null,w和h都是0,所以到后面调用heap->getBase()时出错,想请教下是什么原因导致调用有问题?我该如何解决。谢谢!!~~~~~~

解决方案 »

  1.   

    4.03接口已经不是原来的接口了
    const char *file_path = env->GetStringUTFChars(file, NULL);    const String16 name("SurfaceFlinger");
        sp<ISurfaceComposer> composer;
        getService(name, &composer);    sp<IMemoryHeap> heap;
        uint32_t w, h;
        PixelFormat f;
       status_t err = composer->captureScreen(0, &heap, &w, &h, &f, 0, 0,0,INT_MAX);
        if (err != NO_ERROR) {
            LOGE("screen capture failed: %s\n", strerror(-err));
            exit(0);
       }    LOGD("screen capture success: w=%u, h=%u, pixels=%p\n",
                w, h, heap->getBase());    LOGD("saving file as PNG in %s ...\n", file_path);    SkBitmap b;
        b.setConfig(SkBitmap::kARGB_8888_Config, w, h);
        b.setPixels(heap->getBase());
        SkImageEncoder::EncodeFile(file_path, b,
                SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality);  
      

  2.   

    呵呵,谢谢,这个问题我之前知道了,不是由于这个原因引起的。最后我发现还是权限的问题。并无提示权限不足,但是执行函数时返回null
      

  3.   

    楼主好,我编译能通过,但是加载.so的时候发生了Ljava/lang/UnsatisfiedLinkError,
    但是我把截屏函数中的代码换成别的就能正常加载.SO并正确执行。不知道楼主碰没碰到过此问题?
      

  4.   


    楼主你好,经过一通弄后,我跟你碰到一模一样的问题,“并无提示权限不足,但是执行函数时返回null”。这个你是怎么解决的啊,请问
      

  5.   

    你先别把它写成so文件 ,先写成可执行文件,手机root后 在java代码中用Runtime.getRuntime.exec("su")
    获取输出流 执行程序文件,看看能否成功运行captureScreen()函数 。
    目前,通过lib方式调用captureScreen函数 都是 用平台签名来解决的 使apk有了读取framebuffer权限,但是这方法没有可移植性,只能在自己的手机上用。
    具体方法我也正在研究中,可以慢慢交流
      

  6.   

    我的 status_t err = composer->captureScreen(0, &heap, &w, &h, &f, 0, 0);这个没有走进去啊 可是后边 printf("screen capture success: w=%u, h=%u, pixels=%p\n",这个log打出来的值是有的 但是t卡上没有生成图片  请问是为什么啊?