在将NDK集成到Android Studio中需要执行以下几个步骤。目前,支持功能被标记为实验性的,AS开始在IDE中捆绑下载NDK的能力。默认情况下,当源代码和/或库放置在jni
或jniLibs
文件夹中时,AS使用通用的Android.mk
和Application.mk
。以下说明覆盖了这些默认设置,以提供更多的自定义能力。
简而言之,您需要执行以下操作:
- 创建默认的
jni
和jniLibs
目录以存放源代码和库。
- 告诉Android Studio你的NDK编译链的位置。
- 告诉gradle如何编译并指定库的存放位置。
- 创建一个
Android.mk
文件来指定构建和链接顺序。
- 创建一些源代码。
创建目录
在/app/src/main
目录下创建jni
和jniLibs
目录。
更新local.properties
在local.properties
文件中添加类似于以下内容的行:
ndk.dir=/home/nathan/development/bin/android-ndk-r10e
更新build.gradle
这是模块级别的设置,而不是应用程序级别的设置。这确保了我们已经在上一步中定义了构建路径,并且移除了Android Studio自动调用ndk-build的功能。请使用以下示例作为指南。
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.0"
defaultConfig.with {
applicationId = "com.example.hellojni"
minSdkVersion.apiLevel = 4
targetSdkVersion.apiLevel = 23
}
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
android.ndk {
moduleName = "hello-jni"
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file('proguard-rules.txt')
}
}
android.productFlavors {
create("arm") {
ndk.abiFilters += "armeabi"
}
create("arm7") {
ndk.abiFilters += "armeabi-v7a"
}
create("arm8") {
ndk.abiFilters += "arm64-v8a"
}
create("x86") {
ndk.abiFilters += "x86"
}
create("x86-64") {
ndk.abiFilters += "x86_64"
}
create("mips") {
ndk.abiFilters += "mips"
}
create("mips-64") {
ndk.abiFilters += "mips64"
}
create("all")
}
}
Android.mk
在/app/src/main/jni
目录下需要有一个Android.mk
文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
test.cpp
在你的lib中添加一些优秀的C/C++源代码。这些文件将位于/app/src/main/jni
目录下,并按照你的Android.mk
进行编译和链接。
示例文件
#include <jni.h>
#include <android/log.h>
static const char *SOME_TAG = "MyAwesomeTag";
extern "C"
{
void
Java_com_something_something_1android_ClassName_some_fn(JNIEnv *env, jobject obj)
{
__android_log_print(ANDROID_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)");
}
}
编译并运行。