將NDK連接到Android Studio需要幾個步驟。目前,支持被標記爲實驗,並且AS正在開始捆綁在IDE中下載NDK的能力。默認情況下,當源和/或庫放置在jni
或jniLibs
文件夾中時,AS使用通用Android.mk
和Application.mk
。以下說明覆蓋這些默認設置以提供更多定製功能。
總之,你將需要:
- 創建默認
jni
和jniLibs
目錄爲源和庫。
- 告訴Android的工作室在哪裏可以找到你的NDK構建鏈
- 告訴gradle這個如何編譯和在何處放置庫
- 創建
Android.mk
文件中指定建築和鏈接順序
- 創建一些源
創建目錄
Inside /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
}
/*
* native build settings
*/
android.ndk {
moduleName = "hello-jni"
/*
* Other ndk flags configurable here are
* cppFlags += "-fno-rtti"
* cppFlags += "-fno-exceptions"
* ldLibs = ["android", "log"]
* stl = "system"
*/
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file('proguard-rules.txt')
}
}
android.productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
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"
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}
Android.mk
您將需要一個Android.mk
文件/app/src/main/jni
目錄內
LOCAL_PATH := $(call my-dir)
# Builds a dylib out of test.cpp
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
TEST.CPP
添加一些真棒C/C++源代碼爲你的lib。這些文件將在/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 :)");
}
} // End extern
編譯和運行將被編譯和鏈接。
是否可以使用studio 2.1生成.so文件? – Hunt