Android Assets打开调用过程源码分析
2017-09-22 16:11
861 查看
一、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.javapublic 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.cppstatic 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/
相关文章推荐
- Android 4.0 Launcher2源码分析——Launcher内容加载详细过程
- 从open系统调用的源码看文件的打开过程
- android 动态注册JNI函数过程源码分析
- ffmpeg源码分析之媒体打开过程
- Android 4.0 Launcher2源码分析——Launcher内容加载详细过程
- Android源码分析之WindowManager.LayoutParams属性更新过程
- Android中按键消息的派发过程及源码分析
- Android服务注册完整过程源码分析
- Android SurfaceFlinger服务启动过程源码分析
- Android 4.0 Launcher2源码分析——Launcher内容加载详细过程
- Android OpenGL库加载过程源码分析
- Android framework源码之JNI实现过程分析
- Android服务查询完整过程源码分析
- Android 4.0 Launcher2源码分析——启动过程分析
- Android 源码分析 -- (一) Android启动过程
- Android服务函数远程调用源码分析
- Android中draw过程分析 (结合Android 4.0.4 最新源码)
- Android请求注册服务过程源码分析
- Android 4.0 Launcher2源码分析——启动过程分析
- 【转】ffmpeg源码分析之媒体打开过程