Android ndk下用AssetManager读取assets的资源

转自:http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html

在使用 cocos2dx 在 Android
上进行游戏开发时,遇到了奇怪的事情,无论什么代码,都无法读资源文件。不得以只好寻求更高版本的Api。

在Android ndk api level 9 之后,提供了一套称为 AssetManager 的api。

这个api 的工作原理是

- Java通过JNI把getAssets得到的AssetManager传递给一个JNI的c函数。


JNI的c函数通过 AAssetManager_fromJava 来取到这个AssetManager对象。

- 通过一系列的 AssetManager 的api来操作Assets。

C的jni函数如下


static AAssetManager * gAssetMgr = NULL;
extern "C"
{
  void Java_org_cocos2dx_lib_Cocos2dxActivity_nativeSetAssetManager(JNIEnv* env, jclass cls, jobject assetManager)
  {
  gAssetMgr = AAssetManager_fromJava( env, assetManager );
  }
};

读取资源的方法如下


do{
AAsset * pAsset = AAssetManager_open(gAssetMgr, pszFileName, AASSET_MODE_UNKNOWN);
if( pAsset == NULL ) break;
size_t size = AAsset_getLength(pAsset);
if( size > 0 )
{
pData = new unsigned char[size];
int iRet = AAsset_read( pAsset, pData, size);
if( iRet <= 0 )
{
delete [] pData;
pData = NULL;
}
}
AAsset_close(pAsset);
if( pAsset == NULL ) size = 0;
if( pSize )
*pSize = size;
} while(0);

这里修改的是cocos2dx的CCFileUtils_Android.cpp 中的getFileData 函数。

最后,在编译libgame.so 时,要注意在Android.mk里的LD参数里加上-landroid来连接有关的库。

Android ndk下用AssetManager读取assets的资源,布布扣,bubuko.com

时间: 2024-11-08 14:43:48

Android ndk下用AssetManager读取assets的资源的相关文章

android ndk下文件遍历与删除

在做手机开发过程中,难免要进行一些本地文件管理操作,比如很多常见app如微博.微信等都有清除缓存功能,该功能就是遍历app自己的缓存目录,然后删除全部缓存文件.使用java的File类可以实现本地文件遍历及删除等等功能,如果使用ndk的方式该如何实现呢?以前写过<基于c++使用win32 api遍历文件夹>,由于android ndk平台属于linux系统,所以该方式是无法使用的.通过查找linux下文件管理相关资料,顺利实现了文件遍历与删除功能,下面为相应代码,需要包含<dirent.

android开发步步为营之54:读取assets,raw文件夹下文件

一.读取assets文件下文件products.json public String readAssetFile(Context c, String file) { Elapsed profiler = new Elapsed(); BufferedReader bufReader = null; try { InputStreamReader inputReader = new InputStreamReader(c.getResources().getAssets().open(file))

Android NDK 下的宽字符编码转换及icu库的使用(转)

原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现,记录下来以备再用. 如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c. ICU4C 是IBM的国际化开发组件ICU的C语言实现版本.在android系统里也有实现.ndk里面并没有公开可用的api,需要自己加载动态库来调用转换函数.

【记录一个问题】android ndk下设置线程的亲缘性,总有两个核无法设置成功

参考了这篇文章:https://blog.csdn.net/lanyzh0909/article/details/50404664 大体的代码如下: #include <pthread.h> #include <sched.h> #include <stdio.h> #include <stdlib.h> #include <sys/sysinfo.h> #include <sys/types.h> #include <unis

下面就介绍下Android NDK的入门学习过程(转)

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的. 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用. 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一

使用GDB调试Android NDK native(C/C++)程序

使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程序,push到Android设备或者仿真器上,然后在设备上运行该程序.而调试则是通过attach到gdbserver来实现.推荐在Ubuntu或者mac osx下来进行,windows下要安装cygwin来模拟posix环境,速度很慢的说.具体操作如下: 0.

使用GDB调试Android NDK native(C/C++)程序-转

最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一.区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持.因此,尝试了下通过一些配置使用gdb来调试Android ndk的C++程序,感觉还算方便,记录下来跟大家分享. 先 说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程 序,push到Android设

Android开发系列(十七):读取assets目录下的数据库文件

在做Android应用的时候,不可避免要用到数据库.但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客解决了我前面博客中写的一个小游戏的一个问题,另外也可以读取Raw目录下的数据库文件) 这就造成了一个问题,这个问题其实很好解决,解决方法如下: 我们首先把有数据的数据库文件放在assets资源目录下边,然后在apk应用启动的时候,把assets目录下的数据库文件的数据写入到真机的内存中去. 下边开始我们的代码编写:

Android开发系列(十七):读取assets文件夹下的数据库文件

在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中写的一个小游戏的一个问题.另外也能够读取Raw文件夹下的数据库文件) 这就造成了一个问题.这个问题事实上非常好解决,解决方法例如以下: 我们首先把有数据的数据库文件放在assets资源文件夹下边,然后在apk应用启动的时候,把assets文件夹下的数据库文件的数据写入到真机的内存中去. 下边開始我们