Android ndk 加载简单的gif 图像
时间:2019-09-13
本文章向大家介绍Android ndk 加载简单的gif 图像,主要包括Android ndk 加载简单的gif 图像使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先获取一个安卓权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
创建一个GifInfoHandle 类
并且调用c++接口
package com.example.ndkdemo; import android.graphics.Bitmap; public class GifInfoHandle { private volatile long gifInfoPtr; static { System.loadLibrary("android_gif"); } public GifInfoHandle(String path) { gifInfoPtr=openFile(path); } public long renderFrame(Bitmap bitmap) { return renderFrame(gifInfoPtr,bitmap); } public synchronized int getwidth() { return getwidth(gifInfoPtr); } public synchronized int getHeight() { return getheight(gifInfoPtr); } //调用 native private native long openFile(String path); //打开文件路径 private native long renderFrame( long gifInfoPtr, Bitmap bitmap); //获取帧率 private native int getwidth(long gifInfoPtr); //获取宽度 private native int getheight(long gifInfoPtr); //获取高度 }
通过配置c++代码获取回调接口
jint getwidth(GifInfo *info){ return info->originalWidth; } jint getHeight(GifInfo *info){ return info->originalHeight; } JNIEXPORT jlong JNICALL Java_com_example_ndkdemo_GifInfoHandle_openFile(JNIEnv *env, jobject thiz, jstring path) { // TODO: implement openFile() return openFile(env,path); } JNIEXPORT jlong JNICALL Java_com_example_ndkdemo_GifInfoHandle_renderFrame(JNIEnv *env, jobject thiz, jlong gif_info_ptr, jobject bitmap) { // TODO: implement renderFrame() return renderFrame(env,gif_info_ptr,bitmap); } JNIEXPORT jint JNICALL Java_com_example_ndkdemo_GifInfoHandle_getwidth(JNIEnv *env, jobject thiz, jlong gif_info_ptr) { // TODO: implement getwidth() getwidth(gif_info_ptr); } JNIEXPORT jint JNICALL Java_com_example_ndkdemo_GifInfoHandle_getheight(JNIEnv *env, jobject thiz, jlong gif_info_ptr) { // TODO: implement getheight() getHeight(gif_info_ptr); }
这里用的动态库在这个网站获取 https://sourceforge.net/projects/giflib/
通过主页面获取回调方法
package com.example.ndkdemo; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ImageView; import android.widget.TextView; import java.io.File; public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. private ImageView imageView; private String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "ds.gif"; private Bitmap bitmap; private GifInfoHandle infoHandle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("TAG", "onCreate: "+path ); imageView=findViewById(R.id.image); infoHandle=new GifInfoHandle(path); int width=infoHandle.getwidth(); int height=infoHandle.getHeight(); bitmap =Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); imageView.setImageBitmap(bitmap); long nextFrameTime=infoHandle.renderFrame(bitmap); infoHandle.renderFrame(bitmap); //循环绘制 handler.sendEmptyMessageDelayed(1,nextFrameTime); } Handler handler=new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); long nextFrameTime =infoHandle.renderFrame(bitmap); imageView.setImageBitmap(bitmap); handler.sendEmptyMessageDelayed(1,nextFrameTime); } }; }
下面是这次的源码
链接:https://pan.baidu.com/s/133c9Fk7BXwPrugP5wCrv5A
提取码:5wa1
复制这段内容后打开百度网盘手机App,操作更方便哦
原文地址:https://www.cnblogs.com/xujunjia/p/11516937.html
- Cloudera Manager Server服务在RedHat7状态显示异常分析
- 开源 | 基于Python的人脸识别:识别准确率高达99.38%!
- 转录组数据的基因表达变化情况探索
- 如何配置Kerberos服务的高可用
- 利用深度学习生成梵高风格画像
- 使用Python-Requests实现ODL对OVS的流表下发
- Keras入门必看教程
- bedtools 用法大全(一文就够吧)
- 区块链资产安全攻略
- 如何在Kudu1.5中使用Sentry授权
- 深度学习入门实战
- 如何使用Zookeeper实现HiveServer2的HA
- Python 统计个人加密货币资产
- 如何使用HAProxy实现HiveServer2负载均衡
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 浅谈前后端分离
- ElementUI使用Cascader实现省市区三级联动
- Js给数组对象新增属性
- idea中使用逆向工程----三部曲
- 《JSON笔记之二》----封装JSONUtil
- Spring源码学习笔记(11)——Event体系
- Spring源码学习笔记(12)——IoC容器启动流程
- HashMap详解
- ElementUI使用autocomplete组件输入搜索
- Hacking with iOS: SwiftUI Edition - 愿望清单项目(三)
- 浏览器在线预览offce,vue-pdf预览pdf文件
- vivo商城前端架构升级-总览篇
- 《JSON笔记之三》---postman中传入json串
- Spring源码学习笔记(13)——JDBC
- java系列之注解