随着移动设备性能的不断提升,越来越多的开发者开始关注原生应用的性能优化。Intel C++编译器提供了一种高效的编译方式,可以帮助开发者在Android平台上构建性能更优的原生应用。本文将介绍如何在Android Studio中使用Intel C++编译器来构建一个简单的原生Android应用。
截至目前,Android Studio的最新版本是1.0.1。Intel Integrated Native Developer Experience (INDE) 提供了对Android Studio 1.0.1的支持。由于Android Studio 1.0.1本身不支持AndroidNDK,本文将提供如何在Android NDK r10d环境下使用Intel C++编译器构建原生Android应用的步骤。
为了确保顺利进行开发,需要安装以下软件:
请确保将以下Android NDK目录添加到环境变量PATH中(如果缺失,请添加):
C:\Intel\INDE\IDEintegration\NDK\build\tools
C:\Intel\INDE\IDEintegration\NDK
安装Intel C++编译器15.0 for Android后,以下工具链将被安装到"[ndk-dir]\toolchains"文件夹中(默认目录是"C:\Intel\INDE\IDEintegration\android-ndk-r10d\toolchains"):
对于NDK r10到r10d,Intel C++编译器在安装后不是默认编译器。请按照以下步骤使用Android Studio中的Intel C++编译器。
将创建一个新的Android项目,该项目将调用一个原生函数来演示如何使用Intel C++编译器。
public native String getStringFromNative();
现在,文件应该看起来像这样:
要构建"nativeDemo"项目,请选择:"Build > Make Project"以准备使用"javah"。
cd src\main
然后,运行以下"javah"命令,在src\main\jni文件夹下创建"com_example_nativedemo_app_MainActivit.h":
javah -d .\jni -classpath C:\Intel\INDE\IDEintegration\android-sdk-windows\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.mydemo.nativedemo.MainActivity
在项目窗口中,将视图更改为Project,右键单击"src"文件夹并选择"Synchronize 'src'"。现在可以在"src\main\jni"文件夹下看到头文件"com_example_mydemo_nativedemo_MainActivity.h"。
创建"main.c"文件:选择文件"com_example_mydemo_nativedemo_MainActivity.h",使用复制/粘贴创建一个新文件"main.c",并添加以下代码:
#include "com_example_mydemo_nativedemo_MainActivity.h"
JNIEXPORT jstring JNICALL
Java_com_example_mydemo_nativedemo_MainActivity_getStringFromNative
(JNIEnv * env, jobject obj)
{
#ifdef __INTEL_COMPILER_UPDATE
return (*env)->NewStringUTF(env, "Hello from Intel C++ !");
#else
return (*env)->NewStringUTF(env, "Hello from default C++ !");
#endif
}
保存更改。现在在"jni"文件夹下有2个文件:
右键单击"jni"文件夹,选择"New > File",输入"Android.mk"并点击"OK"。
在该文件中添加以下行(注意LOCAL_SRC_FILES应包含位于"jni"文件夹中的源文件):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nativeDemo
LOCAL_SRC_FILES := main.c
include $(BUILD_SHARED_LIBRARY)
右键单击"jni"文件夹,选择"New > File",输入"Application.mk"并点击"OK"。
在该文件中添加以下行:
# For IA-32
#APP_ABI:=x86
#NDK_TOOLCHAIN:=x86-icc
#include $(BUILD_SHARED_LIBRARY)
# For Intel-64
APP_ABI:=x86_64
NDK_TOOLCHAIN:=x86_64-icc
include $(BUILD_SHARED_LIBRARY)
打开"app\build.gradle"文件,并在文件顶部添加以下导入:
import com.android.build.gradle.tasks.NdkCompile
import org.apache.tools.ant.taskdefs.condition.Os
在"defaultConfig"部分之后添加以下行:
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
//set .so files location to libs
}
tasks.withType(NdkCompile) {
// disable automatic ndk-build call
compileTask ->
compileTask.enabled = false
}
task ndkBuild(type: Exec) {
// call ndk-build(.cmd) script
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath
}
else {
commandLine 'ndk-build', '-C', file('src/main').absolutePath
}
}
tasks.withType(JavaCompile) {
compileTask ->
compileTask.dependsOn ndkBuild
}
在文件末尾添加以下行:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
保存更改。现在构建项目:选择[Build > Make Project]。将看到所有输出文件夹和文件"libmain.so"位于"main\libs"和"main\obj\local"文件夹下。
打开res\layout\activity_main.xml并修改textview小部件,如下所示:
更新"MainActivity.java",将原生库调用连接到UI textview小部件:
public class MainActivity extends Activity {
static {
// load the native library "nativeDemo"
System.loadLibrary("nativeDemo");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get the text string from native API, and display on the UI
TextView tv = (TextView)findViewById(R.id.hello_textview);
tv.setText(this.getStringFromNative());
}
}
按下ALT + ENTER导入TextView小部件并保存更改。