您的位置:首页 > 移动开发 > Android开发

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

2017-09-22 16:11 861 查看


 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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: