使用Intel C++编译器在Android Studio中构建原生应用

随着移动设备性能的不断提升,越来越多的开发者开始关注原生应用的性能优化。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应用的步骤。

所需软件工具

为了确保顺利进行开发,需要安装以下软件:

  • Oracle JDK 7(针对Windows x64系统的原生Intel-64 JDK)
  • Android SDK 20或更高版本
  • NDK r10d(假设已安装在:[ndk-dir])
  • Android Studio 1.0.1

请确保将以下Android NDK目录添加到环境变量PATH中(如果缺失,请添加):

C:\Intel\INDE\IDEintegration\NDK\build\tools C:\Intel\INDE\IDEintegration\NDK

Android Studio中使用Intel C++编译器

安装Intel C++编译器15.0 for Android后,以下工具链将被安装到"[ndk-dir]\toolchains"文件夹中(默认目录是"C:\Intel\INDE\IDEintegration\android-ndk-r10d\toolchains"):

  • x86-icc
  • x86-icc15.0.X.YYY
  • x86_64-icc(如果NDK支持64位目标)
  • x86_64-icc15.0.X.YYY(如果NDK支持64位目标)

对于NDK r10到r10d,Intel C++编译器在安装后不是默认编译器。请按照以下步骤使用Android Studio中的Intel C++编译器。

创建一个新的Android项目

将创建一个新的Android项目,该项目将调用一个原生函数来演示如何使用Intel C++编译器。

  1. 打开Android Studio,创建一个新的Android项目"nativeDemo",使用默认设置。
  2. 打开"app\src\main\java\MainActivity.java"文件,并在类"MainActivity"的末尾添加以下原生函数:
public native String getStringFromNative();

现在,文件应该看起来像这样:

构建"nativeDemo"项目

要构建"nativeDemo"项目,请选择:"Build > Make Project"以准备使用"javah"。

  1. 打开终端窗口从"View > Tools Windows > Terminal",并按照以下步骤运行"javah"并创建jni头文件:
  2. 在终端窗口中,导航到"src\main"子文件夹:
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

创建"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个文件:

  • com_example_mydemo_nativedemo_MainActivity.h
  • main.c

添加make文件:Android.mk

右键单击"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)

添加make文件:Application.mk

右键单击"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)

配置应用程序以使用make文件运行ndk-build

打开"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"文件夹下。

为textview小部件添加ID "hello_textview"

打开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小部件并保存更改。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485