Unity3D mono arm 非要吃中断 33
现在也不到有多少游戏是 Unity3D 写的
操作倒是很省事,在Unity中写了程序,直接生成了 Android的 APK
但内部其实还是听复杂的,对于用 C#生成的脚本需要用 mono 来解释执行
而Android应用本来就是运行在Dalvik Java 虚拟机, 就是经过了两层 runtime 才运行
不过我们更”变态“,我们想在qemu-arm ( 主机是x86) 中运行带 mono 的Unity程序
结果遇到个问题
mono 报错
mono : * Assertion at mini-posix.c:382, condition `sigaction (signo, &sa, &previous_sa) != -1‘ not met
加 log 发现是设置 中断 33 出现的问题
========
do_sigaction sig 33 host_sig 33 ret -1
02-10 03:54:43.441 147 186 F mono : * Assertion at mini-posix.c:382, condition `sigaction (signo, &sa, &previous_sa)
!= -1‘ not met
编写了一个小程序 pnp5 直接截取中断 33 出错
$ LD_LIBRARY_PATH=./system/bionic_arm/system/lib ./system/target_libc/system/bin/qemu-arm ./system/bionic_arm/system/bin/pnp5
sigaction 33 return -1
用glibc编译此程序运行也出错
应该是Ubuntu Linux 不让 设置 中断 33
不过既然 Unity 这么流行,不可能就这样出错,在arm手机试验
用NDK编译此程序,居然没有出错
因此在Android的 linux中, 中断 33是允许设置的
程序清单
payne@payne-desktop:~/pnp/pnp5$ cat Android.mk #ifeq ($(TARGET_ARCH),arm) LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= main.c LOCAL_MODULE:= pnp5 LOCAL_MODULE_TAGS := optional include $(BUILD_EXECUTABLE) #endif payne@payne-desktop:~/pnp/pnp5$ cat main.c #include <signal.h> #include <stdio.h> void termination_handler (int signum) { /* struct temp_file *p; for (p = temp_file_list; p; p = p->next) unlink (p->name); */ } int main (void) { struct sigaction new_action, old_action; int my_singals[9] = { 4,6,7,8,11,16,13,34,33 }; int i=0; /* Set up the structure to specify the new action. */ new_action.sa_handler = termination_handler; sigemptyset (&new_action.sa_mask); new_action.sa_flags = 0; for ( i=0; i<9; i++ ) printf(" sigaction %d return %d\n",my_singals[i], sigaction(my_singals[i], &new_action, &old_action)); return 0; }
另外 Unity 生成的 x86 lib是可以在Ubuntu Linux 下跑得,所以只有 mono-arm 的库才设置中断 33
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。