用NDK开发了一个在ADB shell上运行的C程序,流程是这样的
1、谋第三方提供了一个动态库给我们调用
2、我们采用隐式调用的方式,调用他们的库,并将他们的接口再封装一层变成我们自己的一层接口,并编译成动态库
3、写一个main程序,采用显示调用,即dlopen的形式调用我们自己编译的库,从而达到最终调用他们的库的办法现在发现一个问题,我在main程序定义的一个全局变量数组,将数组头地址传入接口,即我们自己编译的库,然后使用里面的东西,发现使用过程貌似内存地址被回收的现象,报了Bus Error,貌似是访问到了错误的空间,于是我在库里定义了一个全局数组,然后当main的指针传入之后,我首先将传入的指针里面的内容拷贝到库定义的数组里面,这样就不会有错了。然后我又试了下,main程序里的数组改为malloc的形式,传入后使用该指针里的内容,挂掉打印了几个地址发现一个奇怪的问题当main是全局变量数组的时候,其地址是0xAB00这样的,当使用malloc申请的出来的内存地址是0xD840这样的,但是库里定义的全局变量打印出来的地址是0x80000000这样的我曾怀疑我的手机又问题,因为我的main执行文件放在/data下,而库都是放在/system/lib下,而我的系统是做过data2sd的也就是说data文件事实上是放在sdcard下的,于是我把main放到/system/lib下,但是还是老样子是否有高人可以指点下这个到底是什么现象?不胜感激
1、谋第三方提供了一个动态库给我们调用
2、我们采用隐式调用的方式,调用他们的库,并将他们的接口再封装一层变成我们自己的一层接口,并编译成动态库
3、写一个main程序,采用显示调用,即dlopen的形式调用我们自己编译的库,从而达到最终调用他们的库的办法现在发现一个问题,我在main程序定义的一个全局变量数组,将数组头地址传入接口,即我们自己编译的库,然后使用里面的东西,发现使用过程貌似内存地址被回收的现象,报了Bus Error,貌似是访问到了错误的空间,于是我在库里定义了一个全局数组,然后当main的指针传入之后,我首先将传入的指针里面的内容拷贝到库定义的数组里面,这样就不会有错了。然后我又试了下,main程序里的数组改为malloc的形式,传入后使用该指针里的内容,挂掉打印了几个地址发现一个奇怪的问题当main是全局变量数组的时候,其地址是0xAB00这样的,当使用malloc申请的出来的内存地址是0xD840这样的,但是库里定义的全局变量打印出来的地址是0x80000000这样的我曾怀疑我的手机又问题,因为我的main执行文件放在/data下,而库都是放在/system/lib下,而我的系统是做过data2sd的也就是说data文件事实上是放在sdcard下的,于是我把main放到/system/lib下,但是还是老样子是否有高人可以指点下这个到底是什么现象?不胜感激
解决方案 »
- 关于Socket问题
- 循环中怎样让Looper.loop();后面程序运行
- Android摄像头的问题
- android2.2上下载都是自己做吗?不能使用DOWNLOAD_MANAGER?
- 新手求指教,当android锁屏之后,系统会自动禁用加速度传感器,陀螺仪等传感器,怎么做才能不会禁用呢?
- android 4.0 使用intent 调用照相机与直接打开系统照相机效果不同
- 一个简单的插入语句,有问题
- 想问下编译内核的问题
- android开发如何实现类似ios系统桌面的文件夹效果
- recycleview怎么只显示三个Item,并且滑动到中间这个Item显示高亮
- res里的资源只能通过ID访问么?
- 求大虾解答!~
malloc用了这么多年了,难道还有新的用法啊?好奇怪啊
用kmalloc呢 ?
之前未曾尝试过,不知道kmalloc要包含的头文件有哪些啊?
2. 访问权限 分析一下系统提示的Log
感谢提供思路,我们现在暂时得出的一个观点是因为传入的指针非字节对齐,很有可能是这个原因造成,x86的CPU一般不会出现这个情况,而arm的CPU貌似对一些变量的地址比较敏感,如果不对齐可能出现Bus error的情况