用ARM的GNU编译器静态编译出来的可执行程序可以在Android的adb shell或者超级终端里执行。但是静态编译无法调用动态库,不用静态编译-static编译的无法在adb shell执行。是否有什么方法可以编译一个可以调用动态库的可执行程序,或者生成一个apk也行,使用cygwin也成,使用eclipse也成,关键是用C语言开发,绕开JAVA层和JNI,最好能提供一些教程示例啥的,谢谢啊
解决方案 »
- 为什么mkdirs()无限false?权限都加了
- ListView滑动一次后,getView方法有部分不执行了!
- 本易的本子被刷成砖头,求救中!
- android使用外部数据库
- 小女子求助关于向手机添加通讯录的问题
- Android JNI传值问题
- Android usb供电可以关闭吗
- ScrollView动态插入Layout后,如何清空ScrollView里的内容,求大神!!!
- 求助 android 8.0的webview 问题
- 下拉放大位移
- 绘制一张大图里的小图并且旋转这张图,有什么方法可以实现吗?
- VM(虚拟机) Ubuntu 环境下,下载了motorola 的代码,但不知如何用. 请指导一下.
你是说要在你的application(可执行程序)中调用动态库(.so),对吗?
http://hi.baidu.com/liuhengloveyou/blog/item/ccee056dacdbcbfe43169443.html
是这样的,就是我们要做一个Android下的一个程序,这个程序需要调用别人交付的一个动态库,这个动态是在NDK下完成,交付的是一个.so文件以及对应的.h的API文件
然后按照一般的开发的例子就是需要在eclips上建立一个Android工程,然后我们还需要编写JNI层的东西去引用他们交付的库,然后上层JAVA再去调用这个JNI。这样就算完成了
但是由于我们JAVA没接触过,就想不用JAVA
之前我在我的手机(HTC G7)上下载一个超级终端,可是执行一些Linux的shell指令,所以我就在想,是不是我可以在Linux上编译一个可执行程序然后放到手机里,通过超级终端来执行,这样我们就可以用纯C来开发了对吧
于是我就找了到了一个工具,在Linux上安装了一个编译器叫ARM GNU/Linux编译器装完后我尝试了
写了一个简单的程序
这个文件名比方说就叫main.c好了
然后再Linux上编译这个程序
指令是
arm-none-linux-gnueabi-gcc -static main.c -o main
然后这样就会编译出来一个可执行的程序
然后把这个程序push到手机比方说
adb push main /mnt/asec
之后进到手机打开超级终端
输入su,然后cd /mnt/asec
然后chmod 777 main
最后./main
就会在超级终端上打印hello android了
你是说使用-static静态编译的可执行程序也可以使用dlopen来调用动态库?
如果可以的话我去试试,还没试过
需要在eclips上建立一个Android工程,然后编写JNI层的东西去引用他们交付的库,然后上层JAVA再去调用这个JNI如果你非要得到.so 取出来的话,只有在开机启动时执行一个脚本:挂载某个硬盘映射到设备系统文件 所有工作都是开机前做好的 然后开机自动加载执行
非常感谢你的建议,我尝试了使用arm-none-linux-gnueabi-gcc静态编译加入libdl.a,然后调用自己编译的动态库,然后吧可执行文件和so文件考到手机里,调用还是失败了,可能还依赖于某些动态库,而android在调用动态库的机制和标准linux有点差别(我个人认为),在android中没有找到ld-linux.so
不过我使用NDK编译出来了可以调用libdl.so的方法,终于成功使用了显示调用动态库,所以,非常感谢你给我的方向~~
非常感谢你的建议,我尝试了使用arm-none-linux-gnueabi-gcc静态编译加入libdl.a,然后调用自己编译的动态库,然后吧可执行文件和so文件考到手机里,调用还是失败了,可能还依赖于某些动态库,而android在调用动态库的机制和标准linux有点差别(我个人认为),在android中没有找到ld-linux.so
不过我使用NDK编译出来了可以调用libdl.so的方法,终于成功使用了显示调用动态库,所以,非常感谢你给我的方向~~
您好您能不能把实现方法,编译方法告诉我啊,我公司也需要用c语言,来执行adb shell,生成so文件释放接口给上层,谢谢