Gradle Build Tools 2.2.0+ - NDK ที่ใกล้เคียงที่สุดที่เคยถูกเรียกว่า 'เวทมนตร์'
ในการพยายามหลีกเลี่ยงการทดลองและเบื่อหน่ายกับ NDK และแฮ็กเกอร์ทั้งหมดของมัน ฉันดีใจที่ Gradle Build Tools 2.2.x ออกมา และตอนนี้มันก็ใช้งานได้แล้ว กุญแจสำคัญคือ externalNativeBuild
และอาร์กิวเมนต์เส้นทางชี้ ndkBuild
ที่ Android.mk
หรือเปลี่ยน ndkBuild
เป็น cmake
และชี้อาร์กิวเมนต์เส้นทางไปที่สคริปต์บิลด์ CMakeLists.txt
android {
compileSdkVersion 19
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 19
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
externalNativeBuild {
cmake {
cppFlags '-std=c++11'
arguments '-DANDROID_TOOLCHAIN=clang',
'-DANDROID_PLATFORM=android-19',
'-DANDROID_STL=gnustl_static',
'-DANDROID_ARM_NEON=TRUE',
'-DANDROID_CPP_FEATURES=exceptions rtti'
}
}
}
externalNativeBuild {
cmake {
path 'src/main/jni/CMakeLists.txt'
}
//ndkBuild {
// path 'src/main/jni/Android.mk'
//}
}
}
หากต้องการรายละเอียดเพิ่มเติม โปรดดูที่หน้า Google เกี่ยวกับการเพิ่มโค้ดเนทิฟ
หลังจากตั้งค่าอย่างถูกต้องแล้ว คุณสามารถ ./gradlew installDebug
และออกไปได้เลย คุณจะต้องทราบด้วยว่า NDK กำลังย้ายไปที่เสียงดังกราวเนื่องจาก gcc เลิกใช้แล้วใน Android NDK
การผสานรวมการทำความสะอาดและสร้าง Android Studio - เลิกใช้แล้ว
คำตอบอื่น ๆ ชี้ให้เห็นวิธีที่ถูกต้องในการป้องกันการสร้างไฟล์ Android.mk
โดยอัตโนมัติ แต่ไม่สามารถก้าวไปสู่ขั้นตอนพิเศษในการบูรณาการกับ Android Studio ได้ดีขึ้น ฉันได้เพิ่มความสามารถในการล้างและสร้างจากแหล่งที่มาโดยไม่จำเป็นต้องไปที่บรรทัดคำสั่ง ไฟล์ local.properties
ของคุณจะต้องมี ndk.dir=/path/to/ndk
apply plugin: 'com.android.application'
android {
compileSdkVersion 14
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "com.example.application"
minSdkVersion 14
targetSdkVersion 14
ndk {
moduleName "YourModuleName"
}
}
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'clean'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
dependencies {
compile 'com.android.support:support-v4:20.0.0'
}
ไดเร็กทอรี src/main/jni
จะใช้โครงร่างมาตรฐานของโปรเจ็กต์ ควรมีความสัมพันธ์จากตำแหน่งไฟล์ build.gradle
นี้ไปยังไดเร็กทอรี jni
Gradle - สำหรับผู้ที่มีปัญหา
ตรวจสอบคำตอบของ Stack Overflow นี้ด้วย
สิ่งสำคัญอย่างยิ่งคือเวอร์ชันการไล่ระดับและการตั้งค่าทั่วไปของคุณถูกต้อง หากคุณมีโปรเจ็กต์เก่า ฉันขอแนะนำให้สร้างโปรเจ็กต์ใหม่ด้วย Android Studio เวอร์ชันล่าสุด และดูว่า Google พิจารณาอะไรเป็นโปรเจ็กต์มาตรฐาน นอกจากนี้ ให้ใช้ gradlew
สิ่งนี้จะช่วยปกป้องนักพัฒนาจากเวอร์ชัน gradle ที่ไม่ตรงกัน สุดท้ายนี้ ปลั๊กอิน gradle จะต้องได้รับการกำหนดค่าอย่างถูกต้อง
และคุณถามว่าปลั๊กอิน gradle เวอร์ชันล่าสุดคืออะไร? ตรวจสอบหน้าเครื่องมือและแก้ไขเวอร์ชันตามนั้น
ผลิตภัณฑ์ขั้นสุดท้าย - /build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
gradleVersion = '2.2'
}
// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
ตรวจสอบให้แน่ใจว่า gradle wrapper
สร้างไฟล์ gradlew
และไดเรกทอรีย่อย gradle/wrapper
นี่คือ gotcha ใหญ่
ndkDirectory
เกิดขึ้นหลายครั้ง แต่ android.ndkDirectory
เป็นวิธีที่ถูกต้องในการรับโฟลเดอร์หลังจาก 1.1 การย้ายโครงการ Gradle ไปเป็นเวอร์ชัน 1.0.0< /ก>. หากคุณใช้ปลั๊กอินเวอร์ชันทดลองหรือเวอร์ชันเก่า ระยะทางของคุณอาจแตกต่างกันไป
person
Cameron Lowell Palmer
schedule
01.11.2014