Android 开发环境搭建Word格式.docx
《Android 开发环境搭建Word格式.docx》由会员分享,可在线阅读,更多相关《Android 开发环境搭建Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
至此,Android开发环境大功告成,下面就来看下如何在模拟器中运行程序。
三、测试Android程序在模拟器中的运行
1新建项目
选择Eclipse菜单File->
New->
AndroidProject,填写工程基本信息后确认。
2查看运行效果
选择Eclipse菜单Run->
Run,选择以Android方式运行。
Android手机模拟器启动后,稍等片刻后显示AndroidLogo,然后进入锁定键盘的待机状态,点“Menu”按钮解锁后就会显示你的测试程序。
由于模拟器启动时间较长,因此开发期间模拟器窗口最好不要关闭。
此外模拟器可更换皮肤,并可按Ctrl+F12来切换显示模式,下面是我更换G1手机皮肤后的例子:
四、NDK使用
1.配置NDK
本处讨论在Windows下使用cygwin处理NDK的Windows版本。
Linux下的使用方法基本一致。
根据unix系系统的规范,所有讨论中涉及名称的字符串均大小写敏感。
这里仅NDK的配置和C代码编译须用cygwin,此后的ANDROID调试等均可使用普通的命令行操作。
参考链接:
R1–R3配置方法:
收到NDK后首先在NDK的主目录(其中包含apps,build,docs,…文件夹)下,输入命令:
build/host-setup.sh
用来配置NDK工具(例如编译器的使用,目标平台等),最终生成out/host/config-host。
由于out必须在主目录中,因此上述命令须在主目录中输入。
R4配置方法:
Cygwin安装时,选择一个镜像下载点,接着installDevel下的Gcc和make两个文件就可以了。
现在说一下,怎样编译项目的问题:
准备:
在Cygwin安装目录下,找到home/username的目录下的.bash_profile文件,打开文件在最后加上
NDK=/cygdrive/d/android-ndk-r4-windows/android-ndk-r4
exportNDK
HOST_AWK=/usr/bin/gawk
exportHOST_AWK
其中d/android-ndk-r4-windows/android-ndk-r4是NDK的根目录。
在R4下,NDK提供了2种编译方式:
1.在Cygwin下,输入cd<
项目路径>
$NDK/ndk-build
2.在Cygwin下,$NDK/ndk-build-C<
project>
2.编译本地源码
本地源码(主要如C文件)均放在sources下。
NDK提供了两个示例,放在sources/sample目录下。
编译只需要在主目录中输入命令:
makeAPP=<
名称>
对于上述示例,分别为hello-jni和two-libs。
1.sources文件夹配置
由于NDK已将MAKE生成系统建立妥善,所以只需要在sources中建立包含源文件的文件夹。
由于NDK的配置是以sources目录作为源文件工程的根节点,因此如果要将源文件工程放在更深的目录,例如sources\package1\proj1,那么就需要在中间的目录中加入一个Android.mk文件,用以转到更深的目录其内容示例可见sources\samples\Android.mk。
上述文件夹proj1名称建议以源文件模块的名称命名。
在源文件工程文件夹中需要有至少一个Android.mk文件用以定义源文件编译信息。
可以参照sources\samples中的两个工程中的示例。
其中LOCAL_MODULE变量必须定义成指定源文件工程(模块)的名称。
2.C源程序JNI入口
C源程序的入口遵照JNI规范:
Java_<
PackageName>
_<
JAVA类名>
FuncName>
其中包名称和Android的JAVA类所属包需要保持一致,只是“.”用“_”替换;
JAVA类即是包含这个(实例)方法的类;
FuncName则是呈现在JAVA中使用的方法名称。
3.apps文件夹配置
在apps文件夹中创建一个ADNROID工程文件夹,名称为APP工程(JAVA)名称,在其中新建一个Application.mk的配置文件,参照两个示例工程设置。
主要设置两个变量:
APP_PROJECT_PATH,这个是ANDROID工程路径和相应指定库生成目录(复制而来,名称为“lib源文件模块名”),一般设置成$(callmy-dir)/project,即当前目录下project中,而库生成目录就是project/libs。
APP_MODULES则是这个ANDROID将包含的上述源文件工程,填入涉及的一个或多个源文件工程名称。
最后在主目录中用makeAPP=<
APP工程名称>
3.创建工程
NDK两个例程已经含有完整的ANDROID例程,可以在Eclipse中直接导入打开。
如果新建一个工程,只需要仿照ANDROID工程的一般过程开始,由于本地库so处于工程目录下,Eclipse会自动将其包含在工程中,并最终一并链入apk。
4.关于JAVA本地(Native)接口JNI
一些参考文档:
1.
2.
3.http:
//journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html有几个注意点:
1.不能在本地代码中跨线程使用JNI量,而目前又暂没找到联入正确JNI环境量和对象或者JVM的方法,因此只能在调用线程中使用回调,意味着设计需要让回调发生在JAVA调用者线程中。
2.CallXXXMethodX(env,obj,methodid,va_arg)中,va_arg必须输入指针(对象的指针如jstring*,原子的指针如int*)。
3.对于跨线程的UI操作侧需要用runOnUiThread。
5.ANDROID工具使用
1.虚拟设备创建(AVD)
使用android命令
创建:
androidcreateavd–n<
虚拟设备名称>
-t<
目标ID>
在通常情况下接受默认选项(不建立hardwareprofile)
删除:
androiddeleteavd–n<
列印:
androidlist
2.在命令行)运行虚拟机
命令:
emulator–avd<
3.ADB常用命令参考:
安装程序:
adbinstall<
待安装APK文件本地位置>
运行命令SHELL:
adbshell,进入SHELL,可以操作访问设备文件系统
adbshell,直接执行命令(SHELL中可以执行logcat)
复制文件:
adbpush<
本地源>
<
设备文件系统绝对地址>
,复制入文件
adbpull<
本地位置>
,复制出文件
adbdevices,查看运行的模拟器/设备状态
6.【示例程序】
一个简单的在屏幕上间歇打印的程序。
1.本地C代码
(仅用于示例,不保证正确性和安全性)
#include
<
jni.h>
stdio.h>
string.h>
malloc.h>
pthread.h>
unistd.h>
typedef
struct
{
JNIEnv*
env;
jobject
thiz;
jclass
cls;
}
UpdateTextContext;
static
int
gRunnerRunning
=
0;
update_text(UpdateTextContext
*context,
char
*buf)
env
context->
thiz
cls
jmethodID
mid
(*env)->
GetMethodID(env,
cls,
"
appendText"
(Ljava/lang/String;
)V"
);
if
(mid
==
NULL)
return
-1;
jstring
s
NewStringUTF(env,
buf);
CallVoidMethodV(env,
thiz,
mid,
&
s);
}
void
Java_com_eden_sample_Sample_initTextGenerator(JNIEnv*
env,
thiz)
}
Java_com_eden_sample_Sample_runTextGenerator(JNIEnv*
buf[64];
counter
UpdateTextContext
context;
context.env
context.thiz
context.cls
GetObjectClass(env,
thiz);
1;
while(gRunnerRunning)
sprintf(buf,
sample
counting:
%d\n"
counter);
r
update_text(&
context,
(r
!
0)
break;
counter++;
sleep
(1);
/*
sleep
for
one
second
*/
Java_com_eden_sample_Sample_stopTextGenerator(JNIEnv*
2.JAVA程序
Packagecom.vendor.sample;
/*packagethatmustkeepinaccordancewiththenativecode*/
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.TextView;
importjava.util.*;
publicclassSampleextendsActivity{
enumUpdateType{
Modify,
Append
}
privateclassUpdateTextRunnerimplementsRunnable{
publicUpdateTextRunner(Strings,UpdateTypetype){
mS=s;
mType=type;
publicvoidrun(){
if(mType==UpdateType.Modify){
mLines.clear();
mLines.add(mS);
mTV.setText(mS);
}
else{
/*intendedtodisplaynomorethan`mMaxLineCount'
*linesandscroll,howeverthisisnot
*alwaysthecase,considerifmSisbroken
*intoseverallines
*/
while(mLines.size()>
mMaxLineCount)
mLines.remove(0);
StringBuildersb=newStringBuilder();
for(inti=0;
i<
mLines.size();
i++)
sb.append(mLines.get(i));
mTV.setText(sb.toString());
privateStringmS;
privateUpdateTypemType;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
mTV=newTextView(this);
mTV.setText("
initialtext"
);
setContentView(mTV);
initTextGenerator();
/*Thefollowingthreadobjectsimplycontains
*anoverridenrunmethodwhichinvokes
*runTextGeneratoronthisSampleobject
mThread=newTextUpdatorThread(this);
mThread.start();
publicvoidonDestroy(){
stopTextGenerator();
try
{
mThread.join();
catch(InterruptedExceptione){
e.printStackTrace();
super.onDestroy();
publicvoidmodifyText(Strings){
this.runOnUiThread(newUpdateTextRunner(s,UpdateType.Modify));
publicvoidappendText(Strings){
this.runOnUiThread(newUpdateTextRunner(s,UpdateType.Append));
publicnativevoidinitTextGenerator();
publicnativevoidstopTextGenerator();
publicnativevoidrunTextGenerator();
privateTextViewmTV;
privateArrayListmLines=newArrayList();
privateintmMaxLineCount=20;
privateTextUpdatorThreadmThread;
static{
System.loadLibrary("
sample"
//thecorrespondingClibraryislibsample.so
}
五、Window下cygwin配合Eclipse配置
1.安装SequoyahAndroidNativeCodeSupport
//download.eclipse.org/sequoyah/updates/1.1/
2.配置
方法一、
1.在Main页面里
Location栏选择你安装Cygewin时配置的root目录下的bash.exe所在路径,F:
\android\NDK\Cygewin\bin\bash.exe
在WorkingDirectory里配置路径为root下的bin目录的路径F:
\android\NDK\Cygewin\root\bin
最重要的是在Arguments的配置,(注意!
NDKr4版本编译C,C++程序的方式做了变化)
--login-c"
cd/cygdrive/f/android/workspace/HelloNDK/jni&
$NDK/ndk-build"
以上参数表示首先登陆Cygwin,然后进入HelloNDK这个工程下的jni目录(该目录下存放c或c++的文件和Android.mk)。
最后执行“ndk-build”命令执行编译。
如果ndk-build命令无法识别,先确认是否成功配置了NDK的所在路径(如F:
\android\NDK\android-ndk-r4)到Path环境变量里。
2.2
在Refresh页,选择Specificresources并选择要刷新的文件为jni
2.3
在BuildOptions页如下选择,则可以实现修改C或C++程序后立自动编译生成**.so文件
同样选择C或者C++原程序所在目录下的所有文件,作为相关的资源(jni)
选中“AllocateConsole”
选中“Launchinbackground”
选中“RunthebuilderAfteraClean”
选中“RunthebuilderDuringmanualbuilds”
选中“RunthebuilderDuringautobuilds”
选中“Specifyworkingsetofrelevantresources”
点击“SpecifyResources”按钮,选择你项目的JNI目录,并包含所有的文件。
点击“OK”按钮。
方法2:
仅适用helios版本
1、将cygwin的目录加入到环境变量
2、在ndk目录下写一个ndk-build.bat,内容如下:
@echooff
setTmpPARAM=--login-c"
cd/cygdrive/%1&
sh$NDK/ndk-build"
setPARAM=%TmpPARAM:
:
=%
bash.exe%PARAM%
3、添加工程编译选项ndk-build.bat${ProjDirPath}如图