用ARM的GNU编译器静态编译出来的可执行程序可以在Android的adb shell或者超级终端里执行。但是静态编译无法调用动态库,不用静态编译-static编译的无法在adb shell执行。是否有什么方法可以编译一个可以调用动态库的可执行程序,或者生成一个apk也行,使用cygwin也成,使用eclipse也成,关键是用C语言开发,绕开JAVA层和JNI,最好能提供一些教程示例啥的,谢谢啊

解决方案 »

  1.   

    我感觉你描述的不太清楚。
    你是说要在你的application(可执行程序)中调用动态库(.so),对吗?
      

  2.   

    我觉得用Linux的标准做法就可以把:
    http://hi.baidu.com/liuhengloveyou/blog/item/ccee056dacdbcbfe43169443.html
      

  3.   


    是这样的,就是我们要做一个Android下的一个程序,这个程序需要调用别人交付的一个动态库,这个动态是在NDK下完成,交付的是一个.so文件以及对应的.h的API文件
    然后按照一般的开发的例子就是需要在eclips上建立一个Android工程,然后我们还需要编写JNI层的东西去引用他们交付的库,然后上层JAVA再去调用这个JNI。这样就算完成了
    但是由于我们JAVA没接触过,就想不用JAVA
      

  4.   


    之前我在我的手机(HTC G7)上下载一个超级终端,可是执行一些Linux的shell指令,所以我就在想,是不是我可以在Linux上编译一个可执行程序然后放到手机里,通过超级终端来执行,这样我们就可以用纯C来开发了对吧
    于是我就找了到了一个工具,在Linux上安装了一个编译器叫ARM GNU/Linux编译器装完后我尝试了
    写了一个简单的程序
    这个文件名比方说就叫main.c好了
    然后再Linux上编译这个程序
    指令是
    arm-none-linux-gnueabi-gcc -static main.c -o main
      

  5.   


    然后这样就会编译出来一个可执行的程序
    然后把这个程序push到手机比方说
    adb push main /mnt/asec
    之后进到手机打开超级终端
    输入su,然后cd /mnt/asec
    然后chmod 777 main
    最后./main
    就会在超级终端上打印hello android了
      

  6.   

    那就按照linux的做法,用dlopen来打开.so,你试过吗?
      

  7.   


    你是说使用-static静态编译的可执行程序也可以使用dlopen来调用动态库?
    如果可以的话我去试试,还没试过
      

  8.   

    首先 ,shell脚本 不是 C语言 还有 只有这种途径是可行的 :
    需要在eclips上建立一个Android工程,然后编写JNI层的东西去引用他们交付的库,然后上层JAVA再去调用这个JNI如果你非要得到.so 取出来的话,只有在开机启动时执行一个脚本:挂载某个硬盘映射到设备系统文件 所有工作都是开机前做好的 然后开机自动加载执行 
      

  9.   


    非常感谢你的建议,我尝试了使用arm-none-linux-gnueabi-gcc静态编译加入libdl.a,然后调用自己编译的动态库,然后吧可执行文件和so文件考到手机里,调用还是失败了,可能还依赖于某些动态库,而android在调用动态库的机制和标准linux有点差别(我个人认为),在android中没有找到ld-linux.so
    不过我使用NDK编译出来了可以调用libdl.so的方法,终于成功使用了显示调用动态库,所以,非常感谢你给我的方向~~
      

  10.   


    非常感谢你的建议,我尝试了使用arm-none-linux-gnueabi-gcc静态编译加入libdl.a,然后调用自己编译的动态库,然后吧可执行文件和so文件考到手机里,调用还是失败了,可能还依赖于某些动态库,而android在调用动态库的机制和标准linux有点差别(我个人认为),在android中没有找到ld-linux.so
    不过我使用NDK编译出来了可以调用libdl.so的方法,终于成功使用了显示调用动态库,所以,非常感谢你给我的方向~~
    您好您能不能把实现方法,编译方法告诉我啊,我公司也需要用c语言,来执行adb shell,生成so文件释放接口给上层,谢谢