出自:https://software.intel.com/zh-cn/blogs/2014/04/22/10-ndk-android
http://www.jianshu.com/p/6ad7864e005e
1. 安装JDK.
1.1 去官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK7软件包,我下载的是jdk-7u51-windows-i586.exe。
1.2 双击安装jdk-7u51-windows-i586.exe,安装过程中JDK和JRE的安装目录选择默认即可。
1.3 配置JDK环境变量
参见百度经验http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html的描述。
2. 去官网http://www.eclipse.org/downloads/下载Eclipse,我下载的eclipse-java-kepler-SR2-win32.zip,解压即可使用。
3. 搭建Android开发环境
3.1 安装Android SDK
3.1.1 去网站http://developer.android.com/sdk/index.html下 载adt-bundle-windows-x86-20140321.zip.先说说这个adt-bundle-windows- x86-20140321,其实用它就可以直接做Android应用开发,但是里面的Eclipse工具不好用,所以我只使用里面的sdk包。
3.1.2 将下载来的adt-bundle-windows-x86-20140321.zip解压,我们要使用的是里面的sdk文件包,将这个sdk文件包放到你想要的目录,后面要用,解压的结果见图一。
(图一)
3.2 安装Eclipse的ADT插件(Android Development Tools).
3.2.1 启动Eclipse, 选择菜单项的Help->Install New Software
3.2.2 点击Add, 输入名称,然后在URL中输入:
http://dl-ssl.google.com/android/eclipse/,OK!
3.2.3 选择需要更新的工具,Finish, 安装完成后重启Eclipse。
3.3 安装Eclipse的NDK插件(Android Native Development Tools),这个插件包里有C语言相关的工具,安装方法同3.2.
3.4 配置ADT插件
3.4.1 启动Eclipse,选择菜单项的Window -> Preferences
3.4.2 选择Android,在SDK Location中选择SDK的安装目录,OK!
3.5 创建虚拟机
3.5.1 选择创建一个Android 模拟设备。选择菜单项的Window ->AVD Manager-> New ,新建一个模拟设备,,选用插件自带的手机模拟器配置,步骤如图二中所示:
第一步:AVD Name:模拟器命名,具体名称没有要求。
第二步:Device:在下拉列表里选择手机配值,可以看到某些参数已经配置好,不需要我们设置。
第三部:Skin:在下拉列表中选择皮肤。
第四步(可选):设置内存大小
以上几个步骤完成后,点击确认,一个手机模拟器就建成了。
(图二)
4. 安装NDK
4.1 去官方网站http://developer.android.com/tools/sdk/ndk/index.html下载最新的NDK开发包,版本一定要R7以上,比如32位windows可下载android-ndk-r9d-windows- x86.zip。
4.2 解压下载的android-ndk-r9d-windows-x86.zip,将其放到你想要的目录下。
注:R7之前的版本,必须要安装Cygwin才能使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。想要做到这一 点,只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK,这一点在后面的步骤会有介绍。
5. NDK实例的实现
5.1 启动Eclipse,新建Android工程(此处名为TestNDK),如图三所示:
(图三)
5.2 在TestNDK工程的根目录下新建文件夹jni,之后找到NDK的安装目录(\samples\hello-jni\jni)下的 Android.mk和hello-jni.c 这两个文件,将其拷贝到TestNDK->jni文件夹下面。
注:如果你很好奇jni文件夹里的hello-jni.c里的函数命名如此刁钻,是怎么写的,并且你如果你想的更远,已经在考虑自己以后怎么写这种文件, 那么我告诉你它里面的函数命名是直接粘贴的一个头文件里的内容。这个头文件可以通过反编译下边提到的HelloJni.java得到。如果你以后要确实要 进行NDK开发,那么你肯定要掌握反编译的方法。为了你能够少走弯路,推荐我的另一篇文章《1分钟攻克NDK开发中javah不能反编译的问题》,链接网址http://blog.csdn.net/golden1314521/article/details/23039417 。
5.3 找到NDK的安装目录(\samples\hello-jni\src\com\example\hellojni)下的HelloJni.java文件,将其拷贝到TestNDK工程src文件夹对应的包下。
5.4 修改项目文件AndroidManifest.xml,将activity标签下的 android:name =“.TestNDKActivity”修改为 android:name =“.HelloJni”。(注:此处的
TestNDKACtivity为项目自动生成的,项目不同,此处也会不同)
5.5 新建并配置一个Builder
5.5.1 点击Project->Properties->Builders->New,新建立一个Builder。在弹出的对话框上面点击Program,OK!如图四所示:
(图四)
5.5.2 在弹出的对话框【Edit Configuration】中,配置选项卡【Main】:
Location中需要填入nkd-build.cmd的路径(NDK安装目录下)。
Working Diretcoty中需要填入TestNDK的工程根目录。
如图五所示:
注意:ubuntu下要换成ndk-build,windows下是 ndk-build.cmd
(图五)
5.5.3 配置选项卡【Refresh】,如图六所示:
勾选“Refresh resources upon completion”,
勾选“The entire workspace”,
勾选“Recuresively include sub-folders”。
(图六)
5.5.4 配置选项卡【Build Options】,如图七所示:
勾选“After a “Clean””,
勾选“During manual builds”,
勾选“During auto builds”,
勾选“Specify working set of relevant resources”。
点击“Specify Resources…”勾选TestNDK工程的“jni“目录 ,Finish!
保存设置,OK!
(图七)
5.5.5 Project->clean->选择工程->点击OK。当在console里面看到如图八所示的信息,则表示一切正常,此时就已经是自动编译代码了。
(图八)
假如你使用的是NDK-R9版本中的例子,你在console里面会看到比上图要多的编译信息,截图如下
(图八)
这时候你要检查一下工程根目录下的libs目录下的子目录,要删除libs中多余的子文件夹,只留下armeabi文件夹和以jar为后缀名的jar包。
如果你是新手,为了避免不必要的麻烦,请你安装NDK时选择R7版本(android-ndk-r7-windows.zip)。
5.5.6 右键点击工程TestNDK,Run As -> Android Application, 运行程序。当出现图九所示信息时,NDK实例运行成功!
(图九)
如果程序运行出错,显示“应用程序**(进程:com.example.***)意外停止,请重试”的错误提示,如图(十)所示
(图十)
这个错误产生的原因极有可能是你的JNI文件的命名或包的声明写错了。查一下程序运行的日志logcat,显示错误为 “java.lang.UnsatisfiedLinkError:stringFromJNI”,说的是Java层调用本地方法 stringFromJNI时,却没有找到这个本地方法,所以除了错。
那么Android虚拟机怎么查找这个本地方法的呢?先说一下Android工程的环境:包名称是com.example.testndk,应用 名称是HelloJni,如果Java层调用了本地方法String stringFromJNI(),那么Android虚拟机就会由这三个变量生成一 个名字:jstring Java_com_example_testndk_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) ,并在本地方法中严格按照这个名字查找同名的本地方法。如果找不到,就会返回上图的错误。所以要确认一下JNI文件的命名或包的声明是否与Java文件中 的一致。
在本地文件(即C或C++文件)改正此错误后,运行,正常显示。
错误:No resource identifier found for attribute 'showAsAction' in package 'android'”
解决:注释掉android:showAsAction="never"
从res/menu
/menu .xml
错误:No resource found that matches the given name '@style/Theme.AppCompat.Light'
解决:
对于这个错误,相信大部分Android开发者都遇到过,可能很多朋友通过百度或者Google已经解决了这个问题,但是网上大部分都只给出了解决方法。
正所谓知其然,知其所以然,本文将从此问题出发,深入分析探讨导致此问题的原因、由其衍生出来的一系列问题及其解决方案。
Android Support Library
The Android Support Library package is a set of code libraries that provide backward-compatible versions of Android framework APIs as well as features that are only available through the library APIs.
Android的SDK版本很多,新的SDK版本包含了很多新的特性,为此Google官方提供Android Support Library package来保证高版本SDK的向下兼容。通过使用此包,可以让拥有最新SDK特性的应用运行在API lever 4(即Android 1.6) 及更高版本的设备之上。
- v4 Support Library
此包用在API lever 4(即Android 1.6)及更高版本之上。它包含了较多的内容,使用非常广泛,例如:Fragment,NotificationCompat,LoadBroadcastManager,ViewPager,PageTabStrip,Loader,FileProvider 等。 -
v7 Support Libraries
此包是针对API level 7(即Android 2.1)及以上版本而设计的,但是v7是要依赖v4这个包的,v7支持了Action Bar以及一些Theme的兼容。Note: v7 appcompat library
v7 appcompat library 是包含在 v7 Support Libraries里面的一个包,正是此包增加了Action Bar 用户界面的设计模式,并加入了对material design 的支持,是我们使用最多的一个兼容包。 -
v13 Support Library
此包是针对API level 13(即Android 3.2)及更高版本设计的,一般我们都不常用,平板开发中能用到,这里就不过多介绍了。 - v17 Preference Support Library for TV
看名字就知道了,此包主要是为了TV设备而设计。
Android Theme
- Hoho Theme
在4.0之前Android可以说是没有设计可言的,在4.0之后推出了Android Design,从此Android在设计上有了很大的改善,而在程序实现上相应的就是Holo风格,所以你看到有类似 Theme.Holo.Light、 Theme.Holo.Light.DarkActionBar 就是4.0的设计风格,但是为了让4.0之前的版本也能有这种风格怎么办呢?这个时候就不得不引用v7包了,所以对应的就有 Theme.AppCompat.Light、Theme.AppCompat.Light.DarkActionBar,如果你的程序最小支持的版本是API14(即Android 4.0),那么可以不用考虑v7的兼容。
- Material Design Theme
Android在5.0版本推出了Material Design的概念,这是Android设计上又一大突破。对应的程序实现上就有Theme.Material.Light、 Theme.Material.Light.DarkActionBar等,但是这种风格只能应用在在5.0版本的手机,如果在5.0之前应用Material Design该怎么办呢?同样的引用appcompat-v7包,这个时候的Theme.AppCompat.Light、Theme.AppCompat.Light.DarkActionBar就是相对应兼容的Material Design的Theme。
问题分析
由此可以得出以下情形会导致本文一开始提出的问题。
- 项目使用的是Theme.AppCompat主题,具体表现为
项目values目录styles.xml文件里面style为
AndroidManifest.xml文件里面<resources> <style name="AppBaseTheme" parent="Theme.AppCompat.Light"></style> <style name="AppTheme" parent="AppBaseTheme"></style> </resources>
android:theme="@style/AppTheme"
-
项目支持的最小SDK小于API 14(即Android4.0),具体表现为
AndroidManifest.xml文件里面,minSdkVersion
<14,比如<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="23" />
-
项目没有导入android-support-v7-appcompat兼容包。
解决方案
此时的解决方法有如下几种:
- 既然没有找到
Theme.AppCompat.Light
主题,那么我就不使用此主题。此时将项目values,values-v11,values-v14目录下的styles.xml文件里面的style都改为<resources> <style name="AppBaseTheme" parent="android:Theme.Light"></style> <style name="AppTheme" parent="AppBaseTheme"></style> </resources>
-
那如果没有找到
Theme.AppCompat.Light
主题,而我们又想要使用最新的主题效果呢,还有种方法就是将AndroidManifest.xml文件里面,minSdkVersion
改成14,比如<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
此时再将项目values,values-v11,values-v14目录下的styles.xml文件里面style都改为
<resources> <style name="AppBaseTheme" parent="android:Theme.Holo.Light"></style> <style name="AppTheme" parent="AppBaseTheme"></style> </resources>
-
当然以上都不是最好的方法,只是提供一种思路。最好的方法就是导入android-support-v7-appcompat库。下面具体介绍:
3.1 通过Android SDK Manager下载最新的Android Support Library。
下载完成之后,可以在以下目录找到AppCompat libraryandroid-sdk/extras/android/support/v7/appcompat
3.2 将此目录下的项目导入到Eclipse中
3.3 右键点击我们的Android项目,选择Properties,左侧选择Android,在下方Library框里点击Add,最后选择appcompat_v7,确定。
此时问题就解决了。
但在以上3.2导入appcompat_v7到Eclipse之后,有可能还会出现错误提示,比如
appcompat_v7\res\values-v23\styles_base.xml:20: error: Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.
出现此问题的原因是appcompat_v7已经更新到了最新版本并且高于编译环境的SDK版本,此时在Android SDK Manager将SDK及编译工具更新到最高版本
升级完成之后右键点击appcompat_v7项目,选择Properties,选择Project Build Target 为最新版本,这样就OK了。
通过以上的分析,相信朋友们以后再遇到AppCompat相关的问题应该不再是问题了。欢迎大家留言讨论。
原文链接:http://www.jianshu.com/p/6ad7864e005e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。