Android ndk 加载简单的gif 图像

Posted xujunjia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,操作更方便哦

以上是关于Android ndk 加载简单的gif 图像的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK实现Gif播放框架

Android NDK实现Gif播放框架

将啥传递给 Android 的 NDK 以便可以使用 OpenCV 加载图像?

如何在Android模拟器上显示Mat图像?使用NDK

Android加载网络GIF完整解决方案

Android开发笔记(一百八十)使用Glide加载特殊图像