Skia的JNI接口
Skia 源代码的位置:/external/skia
其中比较重要的函数有:skcanvas.cpp 位置:skia/src/core/
比较重要的几个类:class Canvas 定义在:
class SkPaint(这个类中包含着画几何图形 完本 和bitmap的样式 颜色等信息)
class SkBitmap
一.先来看看skcanvas类里面的函数:
这个类里面的函数大概分为几类:
1) 构造函数和析构函数:
2) 和GL相关的 virtual bool getViewport(SkIPoint*size) const;
virtualbool setViewport(int x, int y);
SkDevice*getDevice() const;
SkDevice*setDevice(SkDevice* device);
virtualSkDevice* setBitmapDevice(const SkBitmap&bitmap);
3) 枚举类型:用来保存状态和
4) 保存信息和恢复相关:virtualint save(SaveFlags flags =kMatrixClip_SaveFlag);//这个函数是用来保存矩形和剪裁的信息,然后将一个副本保存在一个私有栈中,后续对他的像旋转,缩放均在这个副本中进行,当调用复原函数的时候这个副本被删除。
virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
aveFlags flags = kARGB_ClipLayer_SaveFlag);//这个函数跟上面的函数类似,多了一个allocate bitmap
int saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
SaveFlags flags =kARGB_ClipLayer_SaveFlag);
virtual void restore();
int getSaveCount() const;//在栈中保存的状态数
5) 跟变换相关的: virtual bool translate(SkScalar dx,SkScalar dy);
virtual bool scale(SkScalar sx, SkScalar sy);
virtual bool rotate(SkScalar degrees);
virtual bool skew(SkScalar sx, SkScalar sy);
virtual bool concat(const SkMatrix& matrix);
virtual void setMatrix(const SkMatrix& matrix);
void resetMatrix();
5) 绘制图画文本的函数:
virtual void drawPoints(PointModemode, size_t count, const SkPoint pts[],
const SkPaint&paint);
参数:
void drawPoint(SkScalarx, SkScalar y, const SkPaint& paint);
参数:x 坐标 ,y 坐标,颜色
void drawPoint(SkScalarx, SkScalar y, SkColor color);
参数:起点的 x坐标 起点的y 坐标 终点的x坐标 终点的y坐标 paint
void drawLine(SkScalarx0, SkScalar y0, SkScalar x1, SkScalar y1,
const SkPaint& paint);
参数:rect的结构体包含着一个矩形的四个坐标点paint
virtual void drawRect(constSkRect& rect, const SkPaint& paint);
void drawIRect(constSkIRect& rect, const SkPaint& paint);
参数:左 上 右 下 paint
void drawRectCoords(SkScalarleft, SkScalar top, SkScalar right,
SkScalar bottom, const SkPaint&paint);
参数: 椭圆的矩形边界 paint
void drawOval(constSkRect& oval, const SkPaint&);
参数:圆心的位置 半径 paint
void drawCircle(SkScalarcx, SkScalar cy, SkScalar radius,
const SkPaint& paint);
参数:椭圆 始角度 时针清楚角度 paint
void drawArc(constSkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
bool useCenter, constSkPaint& paint);
参数:
void drawRoundRect(constSkRect& rect, SkScalar rx, SkScalar ry,
const SkPaint&paint);
virtual voiddrawPath(const SkPath& path, const SkPaint& paint);
virtual void drawBitmap(constSkBitmap& bitmap, SkScalar left, SkScalar top,
const SkPaint*paint = NULL);
virtual void drawBitmapRect(constSkBitmap& bitmap, const SkIRect* src,
constSkRect& dst, const SkPaint* paint = NULL);
virtual void drawBitmapMatrix(constSkBitmap& bitmap, const SkMatrix& m,
constSkPaint* paint = NULL);
参数:这个函数类似于画位图
virtual void drawSprite(constSkBitmap& bitmap, int left, int top,
const SkPaint*paint = NULL);
参数:下面几个函数都是跟画文本相关的。
virtual voiddrawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, const SkPaint&paint);
virtual void drawPosText(constvoid* text, size_t byteLength,
const SkPointpos[], const SkPaint& paint);
virtual void drawPosTextH(constvoid* text, size_t byteLength,
const SkScalarxpos[], SkScalar constY,
constSkPaint& paint);
void drawTextOnPathHV(constvoid* text, size_t byteLength,
const SkPath&path, SkScalar hOffset,
SkScalar vOffset,const SkPaint& paint);
virtual void drawTextOnPath(constvoid* text, size_t byteLength,
constSkPath& path, const SkMatrix* matrix,
constSkPaint& paint);
参数:画图片
virtual voiddrawPicture(SkPicture& picture);
virtual voiddrawShape(SkShape*);
virtual void drawVertices(VertexModevmode, int vertexCount,
const SkPointvertices[], const SkPoint texs[],
const SkColorcolors[], SkXfermode* xmode,
const uint16_tindices[], int indexCount,
constSkPaint& paint);
二:
JNINativeMethod的定义 :位于:/dalvik/libnativehelper/include/nativehelper/jni.h
typedef struct {
const char* name;
const char* signature;
viod* fnptr;
}
下面就是函数映射表
static JNINativeMethod gCanvasMethods[] = {
{"finalizer", "(I)V", (void*) SkCanvasGlue::finalizer},
{"initRaster","(I)I", (void*) SkCanvasGlue::initRaster},
{"initGL","()I", (void*) SkCanvasGlue::initGL},
{"isOpaque","()Z", (void*) SkCanvasGlue::isOpaque},
{"getWidth","()I", (void*) SkCanvasGlue::getWidth},
{"getHeight","()I", (void*) SkCanvasGlue::getHeight},
{"native_setBitmap","(II)V", (void*) SkCanvasGlue::setBitmap},
{"nativeSetViewport", "(III)V", (void*) SkCanvasGlue::setViewport},
{"save","()I", (void*) SkCanvasGlue::saveAll},
{"save","(I)I", (void*) SkCanvasGlue::save},
{"native_saveLayer","(ILandroid/graphics/RectF;II)I",
(void*) SkCanvasGlue::saveLayer},
{"native_saveLayer","(IFFFFII)I", (void*) SkCanvasGlue::saveLayer4F},
{"native_saveLayerAlpha","(ILandroid/graphics/RectF;II)I",
(void*) SkCanvasGlue::saveLayerAlpha},
{"native_saveLayerAlpha","(IFFFFII)I",
(void*) SkCanvasGlue::saveLayerAlpha4F},
{"restore","()V", (void*) SkCanvasGlue::restore},
{"getSaveCount","()I", (void*) SkCanvasGlue::getSaveCount},
{"restoreToCount","(I)V", (void*) SkCanvasGlue::restoreToCount},
{"translate","(FF)V", (void*) SkCanvasGlue::translate},
{"scale","(FF)V", (void*) SkCanvasGlue::scale__FF},
Jni和本地函数映射表 这个表注册给java虚拟机 这样就可以找到相应的本地函数 也可以选择将函数名字按照android jni接口的命名规则 这样带来的麻烦是函数的名字会非常的长
上层的应用用java 语言写成 底层实现使用c++ 或者c语言实现的 这就需要在android里面有一层jni接口 完成上层java到本地c++的转化 可以定义函数映射表注册到java虚拟机
以drawpoints为例
ClassSkCanvasGule{
Public:
static void drawPoint(JNIEnv* env, jobject jcanvas, float x, float y,
jobject jpaint) {
NPE_CHECK_RETURN_VOID(env, jcanvas);
NPE_CHECK_RETURN_VOID(env, jpaint);
SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas);
const SkPaint& paint = *GraphicsJNI::getNativePaint(env, jpaint);
canvas->drawPoint(SkFloatToScalar(x), SkFloatToScalar(y), paint);
}
函数调用canvas的函数drawPoints ,实现java通过jni 调用本地函数。