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/

Android ndk 加载简单的gif 图像

 

 通过主页面获取回调方法

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 图像

上一篇:C#按物理尺寸打印图片 e.Graphics.DrawImage(image,0,0); //按物理尺寸打印


下一篇:c# 中base64字符串和图片的相互转换