c - Android-NDK:在 Android API 27 中使用 shmget、shmctl、shmdt 时出现运行时错误

标签 c android-ndk

我需要移植一个使用System V共享内存进行IPC的 native 库。调用诸如 shmget()shmctl()shmdt() 等方法。我能够编译 native 代码并构建 native 库,但是当我在模拟器的帮助下运行该库时,应用程序崩溃了。

下面是崩溃的行。

iShmId = shmget( tKey, iSize, IPC_CREAT | IPC_EXCL | _DEF_ACCESS );

我使用的是 Android Studio,Android API 级别 27。

我发现了这个链接:How to use shared memory in android native code?据说不支持这些 API,但我认为最新的 Android API 级别 27 可能支持相同的功能。

我验证了 ndk-bundle\sysroot\usr\include\sys\shm.h header ,这些 API 似乎自 API 26 起就受到支持,下面是 shm 的摘录.h 文件。

#if __ANDROID_API__ >= 26
void* shmat(int __shm_id, const void* __addr, int __flags) __INTRODUCED_IN(26);
int shmctl(int __shm_id, int __cmd, struct shmid_ds* __buf) __INTRODUCED_IN(26);
int shmdt(const void* __addr) __INTRODUCED_IN(26);
int shmget(key_t __key, size_t __size, int __flags) __INTRODUCED_IN(26);

#endif /* __ANDROID_API__ >= 26 */

任何人都可以告诉我我在这里缺少什么吗?由于我能够编译和构建该库,因此应该支持这些 API。所以,我应该错过一些东西。

以下是来自 Logcat 的错误:

2018-12-09 12:43:51.313 31453-31473/com.android.phone A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 31473 (HwBinder:31453_), pid 31453 (m.android.phone)
2018-12-09 12:43:51.490 31529-31529/? A/DEBUG: backtrace:
2018-12-09 12:43:51.490 31529-31529/? A/DEBUG:     #00 pc 00000b39  [vdso:e9577000] (__kernel_vsyscall+9)
2018-12-09 12:43:51.490 31529-31529/? A/DEBUG:     #01 pc 0001fdf8  /system/lib/libc.so (syscall+40)
2018-12-09 12:43:51.490 31529-31529/? A/DEBUG:     #02 pc 000321fe  /system/lib/libc.so (shmget+46)
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #03 pc 00016b57  /data/app/com.example.****.app--7DjBy2wqavG-QlF-n6rDg==/lib/x86/libNativeLib.so
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #04 pc 0001684f  /data/app/com.example.****.app--7DjBy2wqavG-QlF-n6rDg==/lib/x86/libNativeLib.so (GetShmSegment+447)
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #05 pc 00014940  /data/app/com.example.****.app--7DjBy2wqavG-QlF-n6rDg==/lib/x86/libNativeLib.so
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #06 pc 000148e7  /data/app/com.example.****.app--7DjBy2wqavG-QlF-n6rDg==/lib/x86/libNativeLib.so (GetCurrentProcessId+23)
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #07 pc 0001b7cf  /data/app/com.example.****.app--7DjBy2wqavG-QlF-n6rDg==/lib/x86/libNativeLib.so (_init+207)
2018-12-09 12:43:51.491 31529-31529/? A/DEBUG:     #08 pc 00023d68  /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+696)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #09 pc 00023b6a  /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+186)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #10 pc 0000c156  /system/bin/linker (__dl__Z9do_dlopenPKciPK17android_dlextinfoPKv+2102)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #11 pc 00007263  /system/bin/linker (__loader_android_dlopen_ext+83)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #12 pc 00000eb6  /system/lib/libdl.so (android_dlopen_ext+38)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #13 pc 00003998  /system/lib/libnativeloader.so (android::OpenNativeLibrary(_JNIEnv*, int, char const*, _jobject*, _jstring*, bool*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*)+424)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #14 pc 0031eb61  /system/lib/libart.so (art::JavaVMExt::LoadNativeLibrary(_JNIEnv*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, _jobject*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*)+3009)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #15 pc 000036f6  /system/lib/libopenjdkjvm.so (JVM_NativeLoad+454)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #16 pc 00022d06  /system/lib/libopenjdk.so (Runtime_nativeLoad+38)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #17 pc 001149ba  /system/framework/x86/boot.oat (offset 0x114000) (java.lang.Runtime.nativeLoad [DEDUPED]+202)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #18 pc 005f0d52  /system/lib/libart.so (art_quick_invoke_static_stub+418)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #19 pc 000a30df  /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+239)
2018-12-09 12:43:51.492 31529-31529/? A/DEBUG:     #20 pc 0029bca2  /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+338)

最佳答案

libc 中可用的系统调用包装器与使这些系统调用可用的内核不同。似乎这些系统调用是不允许的,因为 SYSCALLS.TXTSECCOMP_WHITELIST_*.TXT 中没有提到它们。

https://android.googlesource.com/platform/bionic/+/master/libc

您是否检查过系统调用中的错误?大概第一个失败了 ENOSYS

编辑:

如果您查看此 header 的最新副本,注释会解释这一点:https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/shm.h 。不过,这些还没有进入发布的 NDK。

关于c - Android-NDK:在 Android API 27 中使用 shmget、shmctl、shmdt 时出现运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53746788/

相关文章:

c - 为什么我的一个功能运行得这么慢?

c - 结构中的指针 "addr"已分配内存,但当我在另一个函数中调用它时,它无法工作

c - 显示从其他 PC 捕获的屏幕缓冲区的最快方法

android - Gradle 同步失败,NDK 未配置,使用 SDK 管理器下载

android - 我们可以在android NDK代码中使用系统IPC吗

java - native 应用程序获取电池电量

C程序从命令行读取输入

c - 读取 AudioFileInitializeWithCallbacks 所需的回调? Apple 音频文件 API

ubuntu - 如何在 linux 中安装 android ndk?

android - android NDK 编译器是否支持内联汇编? (即 asm 或 __asm 关键字?)