Windows平台上Android NDK初试用

一,安装准备:
1,安装Java环境:http://www.oracle.com/technetwork/java/javaee/downloads/index.html
下载后解压并配置环境变量,这不多说。请确保java安装ok:

C:\Documents and Settings\Administrator>java -version
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Client VM (build 21.1-b02, mixed mode, sharing)

2,下载Android NDK:http://developer.android.com/tools/sdk/ndk/index.html
根据不同的操作系统下载对应的版本,比如我这里下载Windows 32-bit:android-ndk-r8e-windows-x86.zip
解压到目录:D:\android\android-ndk-r8e-windows-x86

3,下载Android SDK,即官方推荐的ADT Bundle:http://developer.android.com/sdk/index.html
下载链接会自动根据客户端操作系统的不同而提供不同的对应版本,因为我这里显示的是ADT Bundle for Windows,下载文件为:adt-bundle-windows-x86-20130522.zip
同样解压:D:\android\adt-bundle-windows-x86-20130522

4,运行ADT Bundle里的eclipse程序,在第一次启动时会提示选择workspace。我这里同样在D:\android目录下新建文件夹workspace,并选择它作为eclipse程序的workspace:D:\android\workspace,勾选:Use this as the default and do not ask again,以免每次启动都提示。
启动OK,关闭默认的帮助提示窗口(即那个带有提示新建一个APP的窗口),至于Google提示的信息收集帮助更好改进,根据情况选NO或YES。

5,进入ADT后,逐步选择菜单:Window -> Preferences,在Preferences窗口左边树型菜单里点击Android,确保右边显示的SDK Location位置正确,即是ADT Bundle解压后目录里的sdk,我这里即为:D:\android\adt-bundle-windows-x86-20130522\adt-bundle-windows-x86-20130522\sdk
再接着点击Android下的NDK节点,将NDK Location选择为前面下载Android NDK后的解压目录,我这里是:D:\android\android-ndk-r8e-windows-x86\android-ndk-r8e
另外,可以查看一下Java -> Installed JREs里显示是否正常,即jre是否安装正确,我这里显示的是jre7,Location为:D:\Program Files\Java\jre7。

二,试试NDK的例子:
因为暂没在ADT里找到直接打开或导入NDK例子的方法,所以下面就按我自己的方法来。
1,进入ADT(即指里面的eclipse)后,新建android工程,依次选择菜单:File -> New -> Android Application Project,在向导第一页的Application Name里输入:Test,其它会自动填充不管。向导所有后面页都不做修改,直接下一步、下一步到完成。关闭所有默认打开窗口,然后再关闭ADT。

Test工程位置在:D:\android\workspace\Test,我这里选择的DNK例子为hello-jni。先把Test工程下的大部分文件(除.classpath和.project以外的其它所有文件)删除,然后把hello-jni的所有文件拷贝过去。

重新启动ADT,会看到如下提示信息:
[2013-07-13 09:47:49 – Test] Unable to resolve target ‘android-3′
右键点击Test工程选择:Properties
左边树形菜单里选择Android,右边选中Android 4.2.2,点击Apply应用和OK按钮后关闭Properties for Test属性窗口。

选择ADT菜单中的Project -> Clean,然后进行重新编译(如果是Build Automatically则自动编译了,否则选择Build All菜单即可),以免出现错误提示:
Description Resource Path Location Type
The project cannot be built until build path errors are resolved Test Unknown Java Problem

如果出现这样的错误提示:
[2013-07-13 09:35:58 – Test] Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7’ instead. Please use Android Tools > Fix Project Properties.
那么请右键点击Test工程,选择:Android Tools->Fix Project Properties

再Build All或自动编译后,没有其他提示错误,就表示初步工作完成。但是,到这里还只是SDK对JAVA源文件的编译工作OK,而利用NDK对C源文件的编译工作还未开始,所以如果此时执行我们编译的Test.apk,会执行失败而提示错误信息:

07-13 00:45:32.970: W/dalvikvm(781): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/hellojni/HelloJni;
07-13 00:45:32.980: W/dalvikvm(781): Class init failed in newInstance call (Lcom/example/hellojni/HelloJni;)
07-13 00:45:33.040: D/AndroidRuntime(781): Shutting down VM
07-13 00:45:33.040: W/dalvikvm(781): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-13 00:45:33.080: E/AndroidRuntime(781): FATAL EXCEPTION: main
07-13 00:45:33.080: E/AndroidRuntime(781): java.lang.ExceptionInInitializerError
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.Class.newInstanceImpl(Native Method)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.Class.newInstance(Class.java:1319)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.os.Looper.loop(Looper.java:137)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.reflect.Method.invoke(Method.java:511)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at dalvik.system.NativeStart.main(Native Method)
07-13 00:45:33.080: E/AndroidRuntime(781): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load hello-jni from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.hellojni-2.apk,libraryPath=/data/app-lib/com.example.hellojni-2]: findLibrary returned null
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.Runtime.loadLibrary(Runtime.java:365)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at java.lang.System.loadLibrary(System.java:535)
07-13 00:45:33.080: E/AndroidRuntime(781): 	at com.example.hellojni.HelloJni.<clinit>(HelloJni.java:64)
07-13 00:45:33.080: E/AndroidRuntime(781): 	... 15 more

进行如下的配置,以使得NDK能对C源文件进行编译,生成so文件。右键点击Test工程,选择:Properties -> Builders -> New,再选中Program后确定。
Name任意指定,Location通过Browse File System 指定,Working Directory通过Browse Workspace指定。
看几个图:


再进行Build All或自动编译后,Console窗口提示如下信息,表示OK:

D:/android/android-ndk-r8e-windows-x86/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 3 in ./AndroidManifest.xml    
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so

2,运行Test了。有两种运行方式,一种是在模拟器上运行:
选择菜单Window -> Android Virtual Device Manager,在窗口右侧点击New…,新建一个模拟器。AVD Name名称随便填,其他根据自己电脑配置进行选择,呵呵:

右键点击Test工程,选择Run As -> Android Application,然后在ADT的Console可以看到相关提示信息,比如:

[2013-07-13 08:28:41 - Test] ------------------------------
[2013-07-13 08:28:41 - Test] Android Launch!
[2013-07-13 08:28:41 - Test] adb is running normally.
[2013-07-13 08:28:41 - Test] Performing com.example.hellojni.HelloJni activity launch
[2013-07-13 08:28:41 - Test] Automatic Target Mode: launching new emulator with compatible AVD 'Test'
[2013-07-13 08:28:41 - Test] Launching a new emulator with Virtual Device 'Test'
[2013-07-13 08:28:48 - Emulator] creating window 0 0 240 400
[2013-07-13 08:28:48 - Test] New emulator found: emulator-5554
[2013-07-13 08:28:48 - Test] Waiting for HOME ('android.process.acore') to be launched...
[2013-07-13 08:30:17 - Test] HOME is up on device 'emulator-5554'
[2013-07-13 08:30:17 - Test] Uploading Test.apk onto device 'emulator-5554'
[2013-07-13 08:30:17 - Test] Installing Test.apk...

模拟器速度很慢,估计是我电脑配置太差,反正我是等了很久。模拟器首先是黑屏,然后是黑屏里显示一个ANDROID的金属颜色字符图片,最后终于进入到模拟器界面了:

在ADT里会提示是否把LogCat显示过来,点Yes,级别我选择的最低级,这样所有信息都显示出来了,方便查看。

另外一种运行方式是在手机上进行。用USB线把手机和电脑连接上,然后在手机里打开USB调试。我的手机是华为C8812,之前公司提供办理电信特惠时消耗我400大洋弄的。我的手机是在设置 -> 开发人员选项 里勾选USB调试即可。
没有装什么额外驱动(以前有装过?不记得了),回到ADT,右键点击Test工程选择:Run As -> Android Application,弹出如下提示框:

选择我的手机,点击OK,手机运行成功,图示如下:

其它一些问题:
错误提示1:

[2013-07-13 08:22:23 - Test] Waiting for HOME ('android.process.acore') to be launched...
[2013-07-13 08:24:55 - Test] HOME is up on device 'emulator-5554'
[2013-07-13 08:24:55 - Test] Uploading Test.apk onto device 'emulator-5554'
[2013-07-13 08:24:55 - Test] Installing Test.apk...
[2013-07-13 08:27:06 - Test] Failed to install Test.apk on device 'emulator-5554!
[2013-07-13 08:27:06 - Test] (null)
[2013-07-13 08:27:06 - Test] Launch canceled!
[2013-07-13 08:28:08 - Emulator] Error accepting connection, aborting

解决方案:
不明,关闭AVD后再执行又可以了,所以遇到不妨多试着执行几次。

错误提示2:

make: *** [clean-installed-binaries] Error 127

Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
/usr/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [libs/armeabi/gdbserver] Error 1

解决方案:将cygwin\bin从系统环境变量path中去掉。

错误提示3:

[2013-07-17 21:03:07 - adb] ADB server didn't ACK
[2013-07-17 21:03:07 - adb] * failed to start daemon *

解决办法(完全拷贝之:http://www.cnblogs.com/miya2012/archive/2012/06/05/2536028.html):

我自己的做法,就是–进程里关掉“wandoujiaXXXX”—启动命令cmd+(adb kill-server)—-重启eclipse。 搞定.
(下面的都是看的别人的解决办法。可以不看。)
网上搜了很多种,但是对我来说都不管用。引起这个错误的原因是有很多方面的。
1.软件冲突。
首先是豌豆荚,尝试关闭豌豆荚,重启eclipse后尝试run as android application….
2.进程里
关闭adb.exe,重启eclipse
3.软件更新
android-sdk的更新
有个老外总结的比较全面:
Try below steps:
Close the Eclipse if running
Go to the Android SDK tools directory in Command Prompt
type adb kill-server
then type adb start-server
No error message is thrown while starting ADB server, then adb is started successfully.
Now you can start Eclipse again.
it worked for me this way, Eclipse should be closed before issuing these commands.
前提是你的adb已经配置好了。 如果这时候依然didn’t ACK,那么启动任务管理器,看看是否有adb.exe.有的话关掉,再重复以上动作就可以了。
还有一个比较容易忽视的很重要的问题,就是打开taskmanager的时候,并没有adb.exe,如果这时候你认为绝对不是adb的问题你就错了。cmd打开dos,输入adb kill-server,这个时候才能真正保证kill掉了adb.exe。切记切记!

错误提示4:

[2013-07-17 21:05:25 - PlaneGame] ------------------------------
[2013-07-17 21:05:25 - PlaneGame] Android Launch!
[2013-07-17 21:05:25 - PlaneGame] adb is running normally.
[2013-07-17 21:05:25 - PlaneGame] Performing com.pg.MainActivity activity launch
[2013-07-17 21:05:25 - PlaneGame] Automatic Target Mode: Unable to detect device compatibility. Please select a target device.
[2013-07-17 21:05:30 - PlaneGame] WARNING: Application does not specify an API level requirement!
[2013-07-17 21:05:30 - PlaneGame] WARNING: Unknown device API version!
[2013-07-17 21:05:30 - PlaneGame] Uploading PlaneGame.apk onto device '????????????'
[2013-07-17 21:05:30 - PlaneGame] Failed to install PlaneGame.apk on device '????????????': adb rejected install command with: device not found
[2013-07-17 21:05:30 - PlaneGame] com.android.ddmlib.AdbCommandRejectedException: device not found
[2013-07-17 21:05:30 - PlaneGame] Launch canceled!

解决办法(完全拷贝之:http://bbs.csdn.net/topics/370216144):

问题找到了,以C8812为例
拨号:*#*#2846579#*#*
ProjectMenu->后台设置->USB端口配置->Google 模式
其他的有些华为手机在后台设置里面没有USB端口配置,还不知到怎么搞

转载请保留地址:http://www.lenky.info/archives/2013/07/2324 或 http://lenky.info/?p=2324

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值