Android c++开发环境主要由以下几个部分构成:
? Android 软件开发包(software Development Kit,SDK)
? Android 原生开发包(Native Development Kit,NDk)
? Android Studio 安卓集成开发工具,类似Eclipse ADT
? Java 开发包(Java Development Kit,JDK)
下面就循序渐进的讲解配置Android C++ 开发环境的步骤,Android开发工具可以在以下三种操作系统平台上运行
Microsoft Windows
Apple Mac OS
Linux
不同的操作系统之间的操作除了配置路劲不大一样,其他没多大区别。
1 配置好相关软件
按照现在的主流电脑配置,软件都尽量考虑采用64位的。
? Java JDK 8
? Android Studio
1.1 下载并安装JDK开发包
Android 开发工具要求必须安装JDK(Java Development Kit) 在安装 android studio 之前需要先安装java JDK 8。
Android studio 支持多种发行版本的JDK,例如:IBM JDK,Open JDK以及 Oracle JDK。因为Oracle 支持的平台较多,是开发者通常采用的版本。
(1)通过访问oracle官网的以下页面
http://www.oracle.com/technetwork/java/javase/downloads/index.html
(2) 单击Java Platform (JDK) 的download 进入平台的安装包清单页面
(3)选中 Accept License Agreement 选项并下载 Windows x64安装包。
下载完成,双击安装向导首先安装JDK,然后安装JRE。在安装过程中,安装向导会让你指定目录以及要安装的组件。 安装过程中,使用notepad记录安装的路径,后面会用到。
程序接下来会停留在jre的安装界面上,同样的可以自己修改路径。
安装完成后,通过运行窗口进入cmd命令控制界面,输入 java -version,如果已经配置到环境变量中,就可以看到版本的详细信息
javah没有调用到,就需要用到上面记录的路径,在环境变量的path中配置。
1.2 安装Android studio
Android Studio 是一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 在国内,可以访问http://www.android-studio.org/网站下载。现在已经更新到3.0 版本,内置了kotlin支持。处于稳定考虑,还是暂时使用2.3版本。
下载完成,双击打开,如果是第一次安装,就一直按照提示,在安装过程中,会顺便下载最新的sdk。
如果本地已经有sdk了,那么可以切换路径。
1.2.1 sdk manger 下载工具
? The Android Native Development Kit (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码。
? CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
? LLDB:一种调试程序,Android Studio 使用它来调试原生代码。
在打开的项目中,从菜单栏选择Tools->Android->SDK Manager 打开
2 点击 SDK Tools标签
3 选中LLDB、CMake和NDK 旁的复选
完成这步,一些基本的配置就完成了。
2 创建项目
在应用开发中,Android studio有两种方式进行c++的开发。
? 采用和eclipse相同的方式,javah生成相应文件,编写编译脚本android.mk
? 采用android studio内置的cmake功能
创建两个实例作为参考,里面涉及到的语法暂不考虑,后面再来分类分析。
2.1 使用传统方式创建的项目
创建一个正常的项目
(1)编写一个jni的java接口类,在内部声明native方法。
public class JniTest{ static { System.loadLibrary("nativelib"); } public native String getString(); }
然后build project 生成中间文件。查看是否已经生成.class文件。
重新编译之后就可以在对应的文件夹看到编译后的 JniTest.class在项目根目录\app\build\intermediates\classes\debug\包路径>
在android studio打开terminal命令行工具,当前路径切换到main目录下,使用javah 生成c语言头文件,并将文件输出到jni文件夹中。
javah -d jni -classpath 项目根目录\app\build\intermediates\classes\debug> 包路径.JniTest
这个 .h 文件可不做修改 ,默认就行。写一个测试的 C 文件nativelib.c 同 .h 文件一样放到 jni 文件夹下。
#include <jni.h> #include "com_example_elvin_testjni_JniTest.h" JNIEXPORT jstring JNICALL Java_com_example_elvin_testjni_JniTest_getString (JNIEnv *env, jobject job){ return env->NewStringUTF("from jni"); }
当然光些这些事编译不过的。
还需要在app路径下配置build
android { defaultConfig { ndk { moduleName "nativelib" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。 stl "stlport_static" //打开.c 的 debug , } } buildTypes { debug { jniDebuggable true //此句不加在真机上 debug 不受影响,但是在虚拟机上不能 debug } } }
重新编译就会在项目根目录\app\build\intermediates\ndk\debug\> 生成相应的 架包文件
自动生成的目录和文件,实际上还需要将这些包移动到 jniLibs文件夹中,方便后续的c代码跟踪编译打断点:
libs:包含指定的目标及体系结构的独立子目录,在打包过程中该目录被包含在apk文件中。
obj: 这是一个中间目录,编译源代码后所产生的目标文件都保存在该目录下。开发人员最好不要访问该目录。
最下面的Android.mk其实就是我们在用eclipse编译jni文件时的配置。这个文件就是之前根据build配置的信息系统生成的。
备注:
可能会编译出现问题,添加一个空的c的语言文件。如果想避免这种情况,请将实现文件名字后缀设置为cpp。这样就可以很自然的编译通过。
备注:
javah 用法:
javah [options] <classes>
其中, [options] 包括:
-o <file> 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> 输出目录
v -verbose 启用详细输出
-h --help -? 输出此消息
-version 输出版本信息
-jni 生成 JNI 样式的标头文件 (默认值)
-force 始终写入输出文件
-classpath <path> 从中加载类的路径
-cp <path> 从中加载类的路径
-bootclasspath <path> 从中加载引导类的路径
<classes> 是使用其全限定名称指定的