用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.   


    malloc用了这么多年了,难道还有新的用法啊?好奇怪啊
      

  2.   

    不错 ,值得关注~~
      用kmalloc呢 ?
      

  3.   


    之前未曾尝试过,不知道kmalloc要包含的头文件有哪些啊?
      

  4.   

    提一些考虑的方向1. 线程安全   可以加一些Log, 看看传入的指针有没有被改写
    2. 访问权限   分析一下系统提示的Log
      

  5.   


    感谢提供思路,我们现在暂时得出的一个观点是因为传入的指针非字节对齐,很有可能是这个原因造成,x86的CPU一般不会出现这个情况,而arm的CPU貌似对一些变量的地址比较敏感,如果不对齐可能出现Bus error的情况