- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从 SD 卡读取 wav 文件,用于我正在使用 NDK 和 100% native 代码构建的音频采样器应用程序。我有一种方法可以遍历包含样本路径的预定义数组,并将每个样本路径单独流式传输到数据缓冲区中,以便稍后由 OpenSL 播放。
当我将文件作为 Assets 加载时,使用以下方法:
int open_asset(AAssetManager* mgr, char* filename, int samp)
{
assert(NULL != mgr);
AAsset *asset = AAssetManager_open(mgr, filename, AASSET_MODE_BUFFER);
__android_log_write(ANDROID_LOG_DEBUG, "ASSET", "AAssetManager_open");
if (NULL == asset)
{
__android_log_write(ANDROID_LOG_DEBUG, "ASSET", "Asset not found, loading aborted.");
return JNI_FALSE;
}
oneshot_samples[samp].buffer_header = (unsigned short*) malloc(HEADER_SIZE);
AAsset_read(asset, oneshot_samples[samp].buffer_header, HEADER_SIZE);
unsigned short* fmttype;
unsigned long* databytes;
fmttype = (oneshot_samples[samp].buffer_header + 10);
if (*fmttype != 0x1)
{
__android_log_write(ANDROID_LOG_DEBUG, "ASSET", "*fmttype not PCM, loading aborted.");
return JNI_FALSE;
}
databytes = (oneshot_samples[samp].buffer_header + 20);
oneshot_samples[samp].data_size = *databytes;
oneshot_samples[samp].buffer_data = (unsigned short*) malloc(*databytes);
AAsset_seek(asset, HEADER_SIZE, SEEK_SET);
AAsset_read(asset, oneshot_samples[samp].buffer_data, oneshot_samples[samp].data_size);
__android_log_print(ANDROID_LOG_DEBUG, "ASSET", "*fmttype: %x", *fmttype);
__android_log_print(ANDROID_LOG_DEBUG, "ASSET", "*databytes: %x", *databytes);
AAsset_close(asset);
__android_log_write(ANDROID_LOG_DEBUG, "ASSET", "AAsset_close(asset)");
return JNI_TRUE;
}
它们加载没有问题。但是对于我的应用程序,我希望用户也能够从 SD 卡中读取样本。我将文件路径更改为 SD 卡上的硬编码位置(仅用于测试),并使用 fopen() 和 fread() 尝试了以下方法:
void open_external_file(char* filepath, int samp)
{
FILE* fp;
oneshot_samples[samp].buffer_header = (unsigned short*) malloc(HEADER_SIZE);
__android_log_print(ANDROID_LOG_DEBUG, "open_external_file",
"filepath: %s", filepath);
__android_log_print(ANDROID_LOG_DEBUG, "open_external_file",
"size of filepath: %d", sizeof filepath);
if ((fp = fopen(filepath, "r")) != NULL)
{
__android_log_write(ANDROID_LOG_DEBUG, "open_external_file", "fopen()");
fread(oneshot_samples[samp].buffer_header, sizeof(unsigned short), HEADER_SIZE, fp);
}
unsigned short* fmttype;
unsigned long* databytes;
fmttype = (oneshot_samples[samp].buffer_header + 10);
if (*fmttype != 0x1)
{
__android_log_write(ANDROID_LOG_DEBUG, "open_external_file", "*fmttype not PCM, loading aborted.");
}
databytes = (oneshot_samples[samp].buffer_header + 20);
oneshot_samples[samp].data_size = *databytes;
oneshot_samples[samp].buffer_data = (unsigned short*) malloc(*databytes);
__android_log_print(ANDROID_LOG_DEBUG, "open_external_file", "*fmttype: %x", *fmttype);
__android_log_print(ANDROID_LOG_DEBUG, "open_external_file", "*databytes: %x", *databytes);
fseek(fp , HEADER_SIZE , SEEK_SET);
fread(oneshot_samples[samp].buffer_data, sizeof(unsigned short), oneshot_samples[samp].data_size, fp);
fclose(fp);
__android_log_write(ANDROID_LOG_DEBUG, "open_external_file", "fclose(fp);");
}
这给了我可怕的 ANR 和不可避免的崩溃:
06-06 11:42:30.915: I/dalvikvm(7222): threadid=3: reacting to signal 3 06-06 11:42:30.915: A/libc(7222): Fatal signal 11 (SIGSEGV) at 0x0000000c (code=1)
但奇怪的是,它似乎是随机发生的——有 36 个奇数样本,有时错误出现在第 4 个之后,有时在 20 个左右之后。看完这篇thread ,它似乎可能是一个段错误,但我不知道它是如何引起的——或者这两种方法之间的区别是什么。
文件头 *fmttype 和 *databytes 的值每次都 100% 正确返回。
我是 C 的新手,所以我很可能做错了一些明显错误的事情 - 如果更有经验的人能够阐明可能的原因,我将不胜感激。
更新:我使用 AAsset_read() 切换回来,但仍然得到:
06-06 12:33:50.393: I/dalvikvm(9755): threadid=3: reacting to signal 3 06-06 12:33:50.393: I/dalvikvm(9755): Wrote stack traces to '/data/anr/traces.txt'
但文件每次仍能正常加载,应用程序也不会崩溃。对于 512 MB 的测试平板电脑,我的测试样本的总大小为 48.4 MB - 这会导致问题吗?不过,如果是的话,我看不出使用 AAsset_read() 会有什么不同。
最佳答案
您正在分配 HEADER_SIZE
字节数:
(unsigned short*) malloc(HEADER_SIZE);
然后阅读HEADER_SIZE * 2
字节进入其中,溢出缓冲区:
fread(oneshot_samples[samp].buffer_header, sizeof(unsigned short), HEADER_SIZE, fp);
( fread()
乘以 sizeof(unsigned short)
,加倍。)
您再次对 HEADER_SIZE
进行相同的过度阅读. android Assets 实现不会失败,因为您正在读取正确数量的数据。通过更改 databytes
修复它。至 sizeof(unsigned short)
.
无关:如果 fopen() 返回 NULL,您可能应该从函数返回,而不是处理未初始化的数据。
“信号 3”消息仅表示系统正在请求应用程序的堆栈跟踪,可能是因为主线程很忙并且没有响应消息。
关于android - 在 NDK 中使用 fopen()、fread() 打开文件时出现致命信号 11,但 AAsset_read 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951680/
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我试图下载android源代码。但是遇到了一个问题。 # repo init -u https://android.googlesource.com/platform/manifest fatal:
尝试运行我 4 年前开发的 Rails 4 项目,从那时起我一直在维护,我遇到了下一个错误,该错误在启动时卡住了应用程序: machine stack overflow in critical reg
这个问题在这里已经有了答案: psql: FATAL: role "postgres" does not exist (32 个答案) 关闭上个月。 我正在设置 Postgresql 以与 Rail
我正在创建新分支并尝试推送该分支(我尝试了以下命令): git push --all -u git push origin NewBranch 但在这两种情况下我都会收到此错误: Permission
我尝试克隆这个 repo 几次,但得到了同样的错误。是不是因为它太大而我的连接速度很慢? $ git clone https://git01.codeplex.com/typescript Cloni
我正在尝试使用 http://danielmiessler.com/study/git/#website 设置 git管理我的网站。 我已经到了指令的最后一步:git push website +ma
当我使用快速启动方法安装Eucalyptus云时,我看到安装失败。以后检查日志文件时,遇到以下错误。 最佳答案 错误消息是: Invalid gateway due to subnet/netmask
黄色, 我尝试按照以下步骤设置选项“在没有用户名和密码的情况下访问(推送到)Github”。 https://medium.com/@amanze.ogbonna/accessing-pushing-
我很难用 postgres 设置 django。 这是我的设置.py: DATABASES = { 'default': { 'ENGINE': 'django.db.back
当我尝试从实时实例服务器访问数据库时出现此错误。有谁知道原因吗? 最佳答案 可能是你的硬盘没有可用空间 关于PostgreSQL:致命:XX000:无法写入初始化文件,我们在Stack Overflo
我正在尝试连接到我的 PostgreSQL 服务器,但 psql 提示我没有有效的客户端证书。以下是我创建证书的方式: 自签名服务器证书: openssl req -new -text -nodes
我团队中的其他人创建了一个新的 git 分支,提交并推送到我们使用的常用远程。当我尝试检查这个分支时,我得到了这个: % git checkout 12382 fatal: Cannot switch
我正在尝试让 TravisCI 自动部署我的 Hakyll 静态站点,根据 this guide . 这是我的存储库的设置方式。我有我的源代码分支,其中包含我的 hakyll 和 Markdown 文
尝试提交时 git commit -a -m "Huge update" 我明白了 fatal: could not parse HEAD Error When Committing 看完fatal:
我想在我的 flutter 应用程序上使用 fcm,所以在创建 firebase 控制台并在我的 gradle 中安装了一些依赖项之后,如下所示: build.gradle:项目 dependenci
我是 GIT 的初学者,现在遇到了一个大问题。我在另一台 PC 上提交并推送了一些文件,现在在我的家用 PC 上,git 坏了。 请看下面: $ git status fatal: failed to
我想从 github 上克隆一个项目到我的电脑上 D:\Projects> git clone https://github.com/***/***.git 但是在下载的时候,出现了几个致命的错误:
所以我尝试使用以下命令获取opencv_contrib: $ git clone https://github.com/Itseez/opencv_contrib 这给了我以下错误: fatal: d
这是我在pod文件中使用的行 pod'SDWebImage','〜> 3.8' 以前是 pod'SDWebImage','〜> 3.7' 我尝试了以下 pod安装 pod更新和 pod更新'SDWeb
我是一名优秀的程序员,十分优秀!