0;android是什么我就不介绍了;大家可以去google下;我下面写的都来自网络知识;我通过自己的测试很研究总结了下;当然不可能没有错误;就像我在网络上看得的文章也不是都是正确的;我尽量说说出现错误的原因;
1;首先要给大家一个概念;就是交叉编译;这个在嵌入式开发是很重要的概念;我们平时写的代码通过编译;然后就在编译的机器上运行;所以我们没有交叉编译这样的概念 ;我们编译代码的环境叫编译环境;而运行代码的环境叫运行环境;有的时候;这个2个环境是不一致的;比如说我们手机上要运行一个程序;我们无法把源代码放到手机上去编译;所以我们必须在PC上编译;这个时候我们用到的编译器不再是我们PC上的了;这个编译器就叫做交叉编译器;后面我们可以看得交叉编译器的设置;
2;我所用的环境是ubuntu 9。04;window上也能够搭建的;不过我的理解所应用程序层面的;大家可以去测试下;
1)我们SUN 的JDK 6.0;大家可以通过新立得软件包安装;
2)我们安装eclipse 3.4;因为android开发需要3。3以上版本;eclipse-SDK-3.4.1-linux-gtk.tar.gz我是用这个的;由于这个2天我建立环境花了很多时间和精力;所以很多步骤记得不是太清楚了;我解压到/home/ibm/work/下面 其中ibm所我的用户名;读者可能叫其他名字;解压之后的文件夹叫eclipse;
3)我们安装android 的SDK;对这个东西我没有作深入的研究;大概就所为了eclipse开发提供虚拟的手机环境;我用的是
android-sdk_r04-linux_86.tgz这个解压缩到刚才的工作目录/home/ibm/work/; 文件夹叫android-ndk-1.6_r1;
4)我们安装android 为eclipse作的插件;eclipse 中 help->software update ->available software ->add set ;填入
https://dl-ssl.google.com/android/eclipse/;然后更新安装;我所跑出去吃饭的;所以不知道用多少时间;
5)设置android SDK;由于4我们更新了插件;所以这个时候我们在window->preference;下面就看得android了;这个时候我们把SDK location地方填写我们android sdk的路径/home/ibm/work/android-sdk-linux_86;这个时候我们完成了设在;
6)我们虚拟一个手机;或者说android运行平台;window ->android sdk 我们new一个平台;我选择的是1。5版本的;其他的各位可以自己去尝试;
7)至此;我们完全可以用JAVA开发android的应用程序了;一般的网络上都只说到这里;我们来建立一个工程;file ->new project 选择android工程即可;这里我就不赘述了;
=========================
3;这个时候大家一定觉得我还没有讲到交叉 编译;因为刚才所JAVA开发;下面我们来讲C/C++开发;JAVA是通过JNI来调用C/C++的动态库的;
1)我们来看看手机里面的文件系统;我们进入到android SDK的tool目录下;我的路径是/home/ibm/work/android-sdk-linux_86/tools;我们通过命令./adb shell就进入了android 的linux下面;
2)好了;我们来写C代码;我写了一个hello world;我必须通过交叉编译工具编译;下面我们来安装交叉编译工具;
我用的是arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2;解压到我的工作目录;arm-2008q3这个所解压之后的文件名字;这个时候我们要设置环境变量;
修改gedit ~/.bashrc 在文件最后添加 export PATH=$PWD:$PATH
修改gedit ~/.profile 在文件最后添加
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
这个时候,我们就可以通过交叉编译工具来编译 android 上的C代码了;我们在hello world的我文件夹下
arm-none-linux-gnueabi-gcc -o hello main.c -static;我们必须加入-static 参数;把库函数编译到hello中;因为android 系统里面没有这些库函数;否则无法运行;
3)我们用./adb push /home/ibm/work/test/hello /data 这个时候我们的代码就到了android 系统的/data下面;用
./adb shell进入到android 进入/data文件夹;我们修改权限chmod 777 ./hello ;运行;./hello ;我们就看到我们熟悉的hello world了;
这里说明一点;这个2天我干了很多事情;所以很多步骤未必记得很清楚;如果有问题可以给我留言;我会尽量解答;
这样我们就能够在android下面运行C代码了;
======================
我们来通过JNI调用动态库;首先;我还没有彻底解决这些问题;我写下来和大家一起探讨;
1)我们在eclipse的android工程中加入JNI函数声明;
static{
System.loadLibrary("myJNICall");
}
static native void getJNICallName();
我们知道用static 修饰的类中的语言是会被执行的;System.loadLibrary("myJNICall");这个就会在类被使用时候;调我的libmyJNICall.so;这个动态库里面有一个函数getJNICallName();我们编译生成了class文件;
2)我们到这个android 工程下;/home/ibm/workspace/android/src;下面用javah -jni com.hello.classname;就能够得到一个com_hello_JNICall.h的头文件;我们再实现这个头文件中的
JNIEXPORT void JNICALL Java_com_hello_JNICall_getJNICallName (JNIEnv * env, jclass obj)
{
printf("hello android this is a dyn lib call!\n");
return;
};
我们再用交叉 编译工具arm-none-linux-gnueabi-gcc -shared -o libmyJNICall.so com_hello_JNICall.c;我们就生成了动态库;
3)我们通过./adb remount ;./adb push 动态库 /system/lib中;我们就能够在 android的/system/lib看到我们的动态库;
这里我研究了半天;没有解决;首先我能够看到这个库;但是运行时候出错;每次重新运行android虚拟机就会丢失;我怀疑;1没有起作用;2因为android 没有C库;所以调用失败;今天晚上我继续研究;
到现在为止;我把大体的东西就说了;要是谁不太明白可以Q我;326238989;这些不过所我这个一周研究的结果;还有很多东西需要作;希望能和大家一起进步;也给有意愿作嵌入式开发的朋友抛砖引玉把;
15 个解决方案
#1
SF
#2
BD
#3
DB
#4
自己顶下;要求加精;如果大家有兴趣;我会把我后续的研究结果拿出来和大家分享;
#5
支持师傅 师傅很用心的去写的
#6
师父。。 我来顶来啦~~
#7
不错,写的很好,虽然有些语句读起来不是很通顺,但是看得出来是用了心的。
#8
有些问题我已经解决了 ;下次连JNI调用一起写出来;随便把设计方案也写下;
#9
MARK,不错,估计以后也就搞这玩意开发了
#10
我也想学android,大家一起分享心得和技术
#11
真不错,楼主加油
#12
楼主 知道如何在android调用 vc++编译的好的DLL么? jni我试过可以(有源码和无源码的),但是android貌似要通过linux编译成.SO文件, 如果我的DLL没有源码,只有出口函数呢?
#13
很不错的帖子,我也正在学JAVA ANDRIOD。共勉。
#14
#15
guzhijie1981
继续写呀?
继续写呀?
#1
SF
#2
BD
#3
DB
#4
自己顶下;要求加精;如果大家有兴趣;我会把我后续的研究结果拿出来和大家分享;
#5
支持师傅 师傅很用心的去写的
#6
师父。。 我来顶来啦~~
#7
不错,写的很好,虽然有些语句读起来不是很通顺,但是看得出来是用了心的。
#8
有些问题我已经解决了 ;下次连JNI调用一起写出来;随便把设计方案也写下;
#9
MARK,不错,估计以后也就搞这玩意开发了
#10
我也想学android,大家一起分享心得和技术
#11
真不错,楼主加油
#12
楼主 知道如何在android调用 vc++编译的好的DLL么? jni我试过可以(有源码和无源码的),但是android貌似要通过linux编译成.SO文件, 如果我的DLL没有源码,只有出口函数呢?
#13
很不错的帖子,我也正在学JAVA ANDRIOD。共勉。
#14
#15
guzhijie1981
继续写呀?
继续写呀?