Android NDK 使用skia 画图及显示图片的例子

分类: Android skia 2013-05-07 22:31  170人阅读  评论(2)  收藏  举报
skia NDK Android

目录(?)[+]

经过查阅资料以及自己尝试,终于实现了在Android NDK 画图和打开并显示图片。现将自己的测试代码以及使用过程中的心得写下,希望与大家交流一下。

首先,测试程序的运行结果如下图所示:

调用DrawJpg打开模拟器中的一张Jpg格式的图片并显示

调用DrawFlag函数画出来的旗帜

下面是具体的代码实现。其中,传递到JNI端的是Canvas。运行的模拟器是Android4.0。Android源码的下载是使用git工具,采用如下命令下载的。

git clone https://android.googlesource.com/platform/external/skia -b android-4.0.1_r1

git clone https://android.googlesource.com/platform/frameworks/base -b android-4.0.1_r1

git clone https://android.googlesource.com/platform/system/core -b android-4.0.1_r1

libskia.so等均是通过DDMS从Android4.0的模拟机上Pull下来的。注意,Android源码和使用的so库的版本必须是一致的。否则,会出现编译出错,只能画线不能画字等错误。

显示的图片是使用DDMS push到Android模拟机上的,放在sdcard目录下。

//com_Test1.h

//JNI 端的头文件,两个函数

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_Test1 */

#ifndef _Included_com_example_test_MainActivity

#define _Included_com_example_test_MainActivity

#ifdef __cplusplus

extern "C" {

#endif

JNIEXPORT jint JNICALL Java_com_example_test1_NativeMethods_DrawFlag

(JNIEnv *, jobject, jobject);

JNIEXPORT jint JNICALL Java_com_example_test1_NativeMethods_DrawJpg

(JNIEnv *, jobject, jobject);

#ifdef __cplusplus

}

#endif

#endif

//Test1.cpp

//JNI端的实现

#include <stdio.h>

#include <stdlib.h>

#include "com_Test1.h"

#include <jni.h>

#include <SkBitmap.h>

#include <SkDevice.h>

#include <SkPaint.h>

#include <SkRect.h>

#include <SkImageEncoder.h>

#include <SkTypeface.h>

#include <SkCanvas.h>

#include <SkDevice.h>

#include <GraphicsJNI.h>

#include <SkStream.h>

#include <cutils/properties.h>

#include <cutils/log.h>

jint Java_com_example_test1_NativeMethods_DrawJpg(JNIEnv * env, jobject  obj, jobject canvas)

{

SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas);//获得画布

if (!canv)

{

return 0;

}

SkBitmap bp;

SkPaint paint;

SkImageDecoder::Format fmt;

bool result = SkImageDecoder::DecodeFile("/sdcard/1.jpg",&bp,SkBitmap::kARGB_8888_Config,SkImageDecoder::kDecodePixels_Mode,&fmt);//解析图片

if(!result)

{

LOGI("decoder file fail!");

return -1;

}

else

{

if(fmt!= SkImageDecoder::kJPEG_Format)//判断图片的格式

{

LOGI("not the JPEG type!");

return -2;

}

else

{

canv->drawBitmap(bp,0,0,&paint);//画图片

}

}

return 1;

}

jint Java_com_example_test1_NativeMethods_DrawFlag(JNIEnv * env, jobject  obj, jobject canvas)

{

SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas);

if (!canv)

{

return 0;

}

SkPaint paint;

paint.setFlags(paint.kAntiAlias_Flag);

SkRect rect;

rect.set(100, 100, 300, 200);

paint.setColor(SK_ColorRED);

canv->drawRect(rect, paint);//画矩形

paint.setColor(SK_ColorGRAY);

paint.setStrokeWidth(10);

canv->drawLine(95, 100, 95, 400, paint);//画旗杆

paint.setTextSize(30);

paint.setColor(SK_ColorBLUE);

paint.setTextAlign(paint.kCenter_Align);

canv->drawText("Hello",5*sizeof(char), 200, 160, paint);    //画字

return 1;

}

//Android.mk

MY_LOCAL_PATH :=$(call my-dir)

LOCAL_PATH :=$(MY_LOCAL_PATH)

MY_LOCAL_ANDSRC :=E:/AndrSrc

include $(CLEAR_VARS)

LOCAL_C_INCLUDES :=$(MY_LOCAL_ANDSRC)/frameworks/base/core/jni/android/graphics \

$(MY_LOCAL_ANDSRC)/external/skia/include/core \

$(MY_LOCAL_ANDSRC)/external/skia/include/config \

$(MY_LOCAL_ANDSRC)/external/skia/include/images \

$(MY_LOCAL_ANDSRC)/external/skia/include/effects \

$(MY_LOCAL_ANDSRC)/external/skia/include \

$(MY_LOCAL_ANDSRC)/frameworks/base/include \

$(MY_LOCAL_ANDSRC)/system/core/include

LOCAL_MODULE    := Test

LOCAL_SRC_FILES := Test1.cpp

LOCAL_LDLIBS :=-llog -lcutils -lskia -ljnigraphics -landroid_runtime

include $(BUILD_SHARED_LIBRARY)

// MainActivity.java

//Java调用端

package com.example.test1;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.util.Log;

import android.view.View;

public class MainActivity extends Activity {

static

{

System.loadLibrary("Test");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyView view;

view=new MyView(this);

setContentView(view);

}

}

class MyView extends View

{

public MyView(Context context) {

super(context);

}

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

NativeMethods method=new NativeMethods();

// method.DrawFlag(canvas);

method.DrawJpg(canvas);

}

}

class NativeMethods

{

public native int DrawFlag(Canvas bmp);

public native int DrawJpg(Canvas bmp);

}

Android NDK 使用skia相关推荐

  1. android jni skia,Android NDK 调用Skia进行底层绘图

    Skia是Android的底层的图形库,最近看了一下参考了了网上的例子最初是这样做的就是从上层直接传一个Canvas再在底层获取它 运行的时候老是不成功,不过可以画图形,比如线.矩形等,最后在网上查了 ...

  2. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  3. android渲染是skia与egl,Huang_Dongsung

    原文:How much Skia GPU can accelerate WebKit rendering on Android http://www.dorothybrowser.com/41/ 翻译 ...

  4. android渲染是skia与egl,opengl和skia哪个快 游戏电脑问题解决分享!

    从Honeycomb[3.x]版本起,Andorid便支持GPU加速,但目前Android并没有使用Skia GPU进行Webkit渲染.Skia GPU使用OpenGL进行后台加速渲染,未来也许会代 ...

  5. Android ndk 安装教程 以及环境变量配置

    现在android ndk 也是非常的方便 第一步 第二步搜索sdk 第三步 把界面切换到SDK Tools 界面 选中ndk  然后在点击Apply 下载即可 然后就是查看ndk 安装到那个目录下面 ...

  6. Android NDK开发之旅29 云服务器Ubuntu下搭建NDK环境,并编译FFmpeg

    ###前言 因为在Linux环境下编译FFmpeg生成库和头文件下比较方便,所以接下来主要操作在Linux环境下进行.但是对于Android NDK 开发新手来说,自己电脑配置Ubuntu Linux ...

  7. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

  8. Android NDK基础样例

    Android NDK基础样例 NDK(Native Development Kit),用C/C++封装一些东西?好像就这么理解好了== 一.环境准备 这个好讨厌==!因为我环境都已经搭了很久了. 已 ...

  9. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

最新文章

  1. Python:从零搭建Redis-Scrapy分布式爬虫
  2. pyrosim有Linux版本吗,烟气流动分析软件Pyrosim版本 2020.4.092
  3. STD中string的常用方法总结
  4. mysql 如何用一条SQL将一张表里的数据插入到另一张表 3个例子
  5. java锁原理_Java锁原理学习
  6. 500个爆文标题_美食爆文大放送 | 烹饪技巧从细节着手,夏日消暑美食最为应时...
  7. Windows Server 2008 故障转移群集简介
  8. rds本地库到rds恢复_阿里云rds 备份和还原
  9. 清除zend studio10.5中的内置浏览器中的历史记录
  10. 土木工程与计算机专业考研学校排名,2017年土木工程专业考研大学排名
  11. java工资管理系统课程设计_java课程设计工资管理系统.doc
  12. GitHub 标星 120K+!这些神器仅需一行代码即可下载全网视频!
  13. 失望时想起了你是什么歌_你是空你是空色即是空空什么歌名
  14. 计算机网络物理层测试2
  15. NOIP 2005 篝火晚会
  16. win7原版镜像_告诉你Ghost系统和原版系统之间的区别,看完再装机也不晚
  17. Py打包应用程序(zipapp打包.pyz文件、pyinstaller打包exe文件)
  18. carto_grapher快速安装避坑指南
  19. android音量界面,android 音量调节以及媒体音量界面
  20. 从零开始做一个SLG游戏(七):游戏系统以及配置表

热门文章

  1. 专家库管理软件专家评审系统_专家系统2 0
  2. IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计
  3. STM32三菱FX1N,FX2N,FX3U,PLC方案 可以直接上传下载梯形图,在线监控,具有称重功能,数码管功能,可以做到10路模拟量
  4. oracle查询备份大小,【EXPDP】使用EXPDP备份数据时预估大小——ESTIMATE参数
  5. 2020年全球及中国术后镇痛药行业市场现状分析,非阿片类药物需求不断增长「图」
  6. 蚂蚁金服开源背后的“有意思”工程师 | 1024快乐
  7. 睿智的目标检测31——非极大抑制NMS与Soft-NMS
  8. Android 插件化开发——宿主APP加载APK插件
  9. 卡特兰(Catalan)数
  10. xadmin自定义页面