Skia的JNI接口

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 调用本地函数。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值