android ndk 资源
android ndk开发已经开始支持纯c/c++开发,但an蟠校盯昂droid开发的过程中,经常会遇到用户自定义资源的问题,那么用户自定义的资源该如何访问,如何存储呢?①通过android ndk提供的api assetmanager访问;②通过posix标准函数fopen系列函数进行访问;③通过linux系统apiopen系列函数进行访问; 方便他人亦是方便自己,如果觉得还行就点下右边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢! 代码的百度云链接:http://pan.baidu.com/s/1pJqfd03 密码:4l33
工具/原料
jdk1.8.0_20
adt-bundle-windows-x86_64-20140702
android-ndk-r10b
win7 x64
assets资源通过asset manager访问
1、通过eclipse导入android ndk自带的测试用例:D:\Android\android-ndk-r10\samples\native-activity关于eclipse剧安颌儿如何导入android ndk自带测试用例的方法,可以参考:http://jingyan.baidu.com/article/c910274bffa502cd361d2da0.html
2、在工程目录下面的assets下面存放用户自定义的资源文件,如:① aa.png② tst/aa.png效果如下:

3、在main.c文件中增加访问用户自定义资源相关操作的头文件:#include <android/asset_manager.h>#include <stdio.h>如下图所示:

4、修改 main.c 中的函数engine_handle_input,内容如下:static int32_t engine_ha荏鱿胫协ndle_input(struct android_app* app, AInputEvent* event) { struct engine* engine = (struct engine*)app->userData; if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { ANativeActivity* activity = app->activity; LOGW("ANativeActivity=[%p]", activity); AAssetManager* assetManger = activity->assetManager; LOGW("AAssetManager=[%p]", assetManger); AAsset* asset = AAssetManager_open(assetManger, "aa.png", AASSET_MODE_UNKNOWN); LOGW("AAsset=[%p]", asset); int nSeek = AAsset_seek(asset, 0, SEEK_SET); LOGW("AAsset_seek=[%d]", nSeek); char szBuf[1024] = {0}; int nRead = AAsset_read(asset, szBuf, sizeof(szBuf)); LOGW("AAsset_read=[%d]", nRead); AAsset_close(asset); AAsset* asset2 = AAssetManager_open(assetManger, "tst/aa.png", AASSET_MODE_UNKNOWN); LOGW("AAsset2=[%p]", asset2); engine->animating = 1; engine->state.x = AMotionEvent_getX(event, 0); engine->state.y = AMotionEvent_getY(event, 0); return 1; } return 0;}具体的解释如下图所示:

5、① 插入手机② 打开logcat界面③ 编译代码④ 运行logcat中的效果如下:

6、点击其中的一条日志,新建一个 logcat filter,如下图所示:

7、① 选择左边自己 新建的 filter;② 设置日志级别为 warn;③ 最后的显示效果如下:

8、注:Assets也可以转换成文件描述符,具体的可以参考函数:AAsset_openFileDescriptor但是当文件使用完以后,需要使用 close来关闭对应的文件描述符
通过fopen的方式
1、依然是在上面的例子上面进行修改
2、修改后的engine_handle_input如下:static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) { struct engine* engine = (struct engine*)app->userData; if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { engine->animating = 1; engine->state.x = AMotionEvent_getX(event, 0); engine->state.y = AMotionEvent_getY(event, 0); if (AKEY_EVENT_ACTION_UP == AKeyEvent_getAction(event)) { ANativeActivity*pNativeActivity = app->activity; char szFile[256] = {0}; sprintf (szFile, "%s/a.txt", pNativeActivity->internalDataPath); FILE*fp = fopen (szFile, "wb"); char szWrite[256] = {"hello"}; int nWrite = fwrite (szWrite, 1, sizeof(szWrite), fp); fclose (fp); fp = fopen (szFile, "rb"); fseek (fp, 0, SEEK_SET); char szRead[256] = {0}; int nRead = fread(szRead, 1, sizeof(szRead), fp); fclose (fp); } return 1; } return 0;}
3、运行后的效果如下:
