程序放在Android4.2的源码目录中能编译通过,也可以执行。本人所期待的结果是在android模拟器的屏幕上显示一个圆,但是实际上什么都没有显示!问题出在哪里?我把程序贴上!求大侠赐教!
Android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
LOCAL_SRC_FILES:= \
main.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libandroidfw \
libutils \
libbinder \
libui \
libskia \
libgui
LOCAL_MODULE:= test-sf
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
main.cpp文件
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <linux/fb.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IMemory.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/MemoryHeapBase.h>
#include <binder/MemoryBase.h>
#include <binder/Binder.h>
#include <utils/Log.h>
#include <cutils/atomic.h>
#include <cutils/properties.h>
#include <utils/threads.h>
#include <utils/Atomic.h>
#include <utils/String16.h>
#include <android_runtime/AndroidRuntime.h>
#include <media/AudioTrack.h>
#include <gui/Surface.h>
#include <gui/ISurface.h>
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <ui/DisplayInfo.h>
#include <core/SkTypeface.h>
#include <core/SkTemplates.h>
#include <core/SkRegion.h>
#include <core/SkDevice.h>
#include <core/SkRect.h>
#include <core/SkCanvas.h>
#include <core/SkBitmap.h>
#include <core/SkStream.h>
//#include <images/SkImageDecoder.h>
//#include <images/SkImageEncoder.h>
using namespace android;
int main()
{
//sp<ProcessState> proc(ProcessState::self());
//ProcessState::self()->startThreadPool();
//IPCThreadState::self()->joinThreadPool();
sp<SurfaceControl> surfaceControl;
sp<SurfaceComposerClient> surfaceclient;
sp<Surface> surface;
SkBitmap bitmap;
Surface::SurfaceInfo info;
DisplayInfo display;
SkPaint paint;
paint.setARGB(255, 255, 0, 0);
surfaceclient = new SurfaceComposerClient();
surfaceclient->getDisplayInfo(0, &display);
surfaceControl = surfaceclient->createSurface(String8("test"), display.w, display.h, PIXEL_FORMAT_RGBA_8888);
surfaceclient->openGlobalTransaction();
surfaceControl->setLayer(0x40000000);
surfaceControl->setSize(display.w, display.h);
surfaceControl->setPosition(0, 0);
surfaceControl->show( );
surfaceclient->closeGlobalTransaction();
surface = surfaceControl->getSurface();
surface->lock(&info);
bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
bitmap.setIsOpaque(true);
bitmap.setPixels(info.bits);
SkCanvas* canvas = new SkCanvas(bitmap);
canvas->drawCircle(640, 260, 100, paint);
surface->unlockAndPost();
sleep(3);
return 0;
}
进展:
上面的问题还是没能解决!原本想用skia来画图的,只是想验证surfaceflinger的功能!貌似android4.2用HWUI代替了skia。skia的接口没研究过,不会使用。移植工作进行中,暂时没时间去研究skia,所以只能从现有的东西上修改了!站在巨人的肩膀上,恩!翻了一下开机动画bootanimation的代码,发现它是用opengl接口画图的,无所谓,把它不必要的功能砍掉做成自己的测试程序,OK!成功显示自己的图片了!