Android Assets打开调用过程源码分析

来源:互联网 发布:mac 新系统打不开u盘 编辑:程序博客网 时间:2024/05/29 19:41


 http://www.tasfa.cn/index.php/2017/09/22/android-assets_sourcecode/

一、Android读取Assets中图片并显示

private Bitmap getImageFromAssetsFile(String fileName){    Bitmap image = null;    AssetManager am = getResources().getAssets();    if (am == null)    {        return null;    }    try    {        InputStream is = am.open(fileName);        image = BitmapFactory.decodeStream(is);        is.close();    }    catch (IOException e)    {        e.printStackTrace();    }    return image;}
首先是获取AssetManager,然后调用其函数open,打开对应的资源文件

二、open函数追朔(Java层)

AssetManager.java

public final InputStream open(String fileName) throws IOException {      return open(fileName, ACCESS_STREAMING); //ACCESS_STREAMING = 2}

open—>

public final InputStream open(String fileName, int accessMode) throws IOException {synchronized (this) {   if (!mOpen) {       throw new RuntimeException("Assetmanager has been closed");   }   long asset = openAsset(fileName, accessMode);   if (asset != 0) {   AssetInputStream res = new AssetInputStream(asset);   incRefsLocked(res.hashCode());   return res; }}  throw new FileNotFoundException("Asset file: " + fileName);}

openAsset–>

private native final long openAsset(String fileName, int accessMode);

三、openAsset函数追朔(Native层)

android_util_AssetManager.cpp

static jlong android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,jstring fileName, jint mode){    AssetManager* am = assetManagerForJavaObject(env, clazz);    if (am == NULL) {        return 0;    }    ALOGV("openAsset in %p (Java object %p)\n", am, clazz);    ScopedUtfChars fileName8(env, fileName);    if (fileName8.c_str() == NULL) {        jniThrowException(env, "java/lang/IllegalArgumentException", "Empty file name");        return -1;    }    if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM        && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {        jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");        return -1;    }    Asset* a = am->open(fileName8.c_str(), (Asset::AccessMode)mode);    if (a == NULL) {        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());        return -1;    }    //printf("Created Asset Stream: %p\n", a);    return reinterpret_cast(a);}


完整请移步 http://www.tasfa.cn/index.php/2017/09/22/android-assets_sourcecode/