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


 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值