我需要移植一个使用System 共享内存的本地库。有对shmget()、shmctl()和shmdt()等方法的调用。我能够编译本机代码并构建本机库,但是当我在模拟器的帮助下运行库时,应用程序就崩溃了。
下面是它的崩溃线。
iShmId = shmget( tKey,iSize,IPC_CREAT x IPC_EXCL _DEF_ACCESS );
我使用的是Android ,Android级别27。
我看到了这样的链接:How to use shared memory in android native code?,据说这些API不受支持,但我认为最新的Android 27可能也有同样的支持。
我验证了ndk-bundle\sysroot\usr\include\sys\shm.h头,这些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)发布于 2018-12-12 19:22:27
libc中可用的syscall包装器与使这些syscall可用的内核不一样。这些系统似乎是不允许的,因为它们在SYSCALLS.TXT或SECCOMP_WHITELIST_*.TXT中没有提到。
https://android.googlesource.com/platform/bionic/+/master/libc
你检查过你的系统中的错误吗?据推测,第一次ENOSYS失败了。
编辑:
如果您查看这个标题的最新副本,注释将解释如下:https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/shm.h。不过,他们还没有把它变成发行的NDK。
https://stackoverflow.com/questions/53746788
复制相似问题