JNI dan Gradle di Android Studio

Saya mencoba menambahkan kode asli ke aplikasi saya. Saya memiliki segalanya di ../main/jni seperti di proyek Eclipse saya. Saya telah menambahkan ndk.dir=... ke local.properties saya. Saya belum melakukan apa pun (saya tidak yakin apa lagi yang sebenarnya diperlukan, jadi jika saya melewatkan sesuatu, beri tahu saya). Ketika saya mencoba dan membangun saya mendapatkan kesalahan ini:

Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /Users/me/android-ndk-r8e/ndk-build NDK_PROJECT_PATH=null 
APP_BUILD_SCRIPT=/Users/me/Project/app/build/ndk/debug/Android.mk APP_PLATFORM=android-19 
NDK_OUT=/Users/me/Project/app/build/ndk/debug/obj 
NDK_LIBS_OUT=/Users/me/Project/app/build/ndk/debug/lib APP_ABI=all

  Error Code:
    2
  Output:
    make: *** No rule to make target `/Users/me/Project/webapp/build/ndk/debug//Users/me/Project/app/src/main/jni/jni_part.cpp',
 needed by `/Users/me/Project/app/build/ndk/debug/obj/local/armeabi-v7a/objs/webapp//Users/me/Project/app/src/main/jni/jni_part.o'.  
Stop.

Apa yang harus saya lakukan?

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include .../OpenCV-2.4.5-android-sdk/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := native_part
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

Aplikasi.mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8

person fredley    schedule 13.01.2014    source sumber
comment
Ada rangkaian pesan di sini yang mungkin memberi Anda sedikit wawasan: grup .google.com/forum/#!topic/adt-dev/-GbnrQA8f7M   -  person Scott Barta    schedule 13.01.2014


Jawaban (6)


Gradle Build Tools 2.2.0+ - NDK yang paling mendekati disebut 'ajaib'

Dalam upaya menghindari eksperimen dan sejujurnya muak dengan NDK dan semua peretasannya, saya senang karena Gradle Build Tools versi 2.2.x telah keluar dan sekarang berfungsi. Kuncinya adalah argumen jalur externalNativeBuild dan menunjuk ndkBuild pada Android.mk atau ubah ndkBuild menjadi cmake dan arahkan argumen jalur pada skrip build 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'
        //}
    }
}

Untuk detail lebih lanjut, periksa laman Google tentang menambahkan kode asli.

Setelah ini diatur dengan benar, Anda dapat ./gradlew installDebug dan berangkat. Anda juga perlu menyadari bahwa NDK akan berubah menjadi dentang karena gcc sekarang tidak digunakan lagi di Android NDK.

Integrasi Bersih dan Bangun Android Studio - TIDAK DIGUNAKAN LAGI

Jawaban lain menunjukkan cara yang benar untuk mencegah pembuatan file Android.mk secara otomatis, tetapi jawaban tersebut gagal melakukan langkah ekstra untuk mengintegrasikan lebih baik dengan Android Studio. Saya telah menambahkan kemampuan untuk benar-benar membersihkan dan membangun dari sumber tanpa perlu membuka baris perintah. File local.properties Anda harus memiliki 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'
}

Direktori src/main/jni mengasumsikan tata letak standar proyek. Ini harus menjadi relatif dari lokasi file build.gradle ini ke direktori jni.

Gradle - bagi mereka yang mengalami masalah

Periksa juga Jawaban Stack Overflow.

Sangat penting bahwa versi gradle dan pengaturan umum Anda sudah benar. Jika Anda memiliki proyek lama, saya sangat menyarankan untuk membuat proyek baru dengan Android Studio terbaru dan lihat apa yang dianggap Google sebagai proyek standar. Juga, gunakan gradlew. Ini melindungi pengembang dari ketidakcocokan versi gradle. Terakhir, plugin gradle harus dikonfigurasi dengan benar.

Dan Anda bertanya apa versi terbaru dari plugin gradle? Periksa halaman alat dan edit versi yang sesuai.

Produk akhir - /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()
    }
}

Pastikan gradle wrapper menghasilkan file gradlew dan subdirektori gradle/wrapper. Ini masalah besar.

Direktori ndk

Ini telah muncul beberapa kali, tetapi android.ndkDirectory adalah cara yang benar untuk mendapatkan folder tersebut setelah 1.1. Memigrasikan Proyek Gradle ke versi 1.0.0. Jika Anda menggunakan plugin versi eksperimental atau kuno, jarak tempuh Anda mungkin berbeda.

person Cameron Lowell Palmer    schedule 01.11.2014
comment
Satu perubahan yang harus saya lakukan: menentukan tugas di luar blok Android. Kalau tidak, gradle mengeluh. - person Utkarsh Sinha; 25.12.2014
comment
Anda dapat menggunakan def ndkDir = android.plugin.ndkFolder sebagai cara sederhana untuk mendapatkan referensi ke plugin android. - person Ben Lings; 02.01.2015
comment
@UtkarshSinha sepertinya salah. Bisakah Anda memverifikasi bahwa Anda menjalankan gradle terbaru? - person Cameron Lowell Palmer; 02.01.2015
comment
Saya melihat masalah yang sama seperti @UtkarshSinha atau yang serupa. Tugas digarisbawahi dengan warna abu-abu dan pesan berikut ditampilkan: Tidak dapat menyimpulkan tipe argumen. Gradle terbaru (2.2.1), dan saya yakin masalahnya ada di tempat lain seperti di sourceSets.main simbol jni dan jniLibs digarisbawahi dengan pesan Tidak dapat menyelesaikan simbol. Saat saya memindahkan tugas di luar blok Android, tidak ada kesalahan yang ditampilkan, tapi menurut saya ini tidak benar. - person Oliver Hausler; 11.01.2015
comment
Apakah Anda yakin menggunakan gradle yang Anda kira? - person Cameron Lowell Palmer; 11.01.2015
comment
@CameronLowellPalmer Saya tidak mengerti apa yang Anda lakukan di sini. File mana yang harus diedit, dan apa yang harus ditambahkan? bisakah Anda melihat perpustakaan saya di sini: github.com/AndroidDeveloperLB/AndroidJniBitmapOperations ? Saya sudah mencoba melakukan apa yang Anda tulis, tetapi menurut saya beberapa dari apa yang Anda tulis perlu diubah dalam kasus saya. - person android developer; 16.01.2015
comment
@androiddeveloper Setelah saya memperbaiki properti gradle-wrapper.properties untuk menggunakan gradle-2.2-all.zip semuanya berjalan dengan baik. - person Cameron Lowell Palmer; 16.01.2015
comment
@CameronLowellPalmer Saya tidak mengerti apa yang Anda tulis. Bisakah Anda memposting ke Github apa yang harus diubah? - person android developer; 16.01.2015
comment
@androiddeveloper periksa permintaan penarikan Anda. Saya telah membuat dua komitmen. - person Cameron Lowell Palmer; 16.01.2015
comment
@UtkarshSinha Saya akan memeriksa pembaruan yang saya buat pada jawaban untuk tujuan klarifikasi. Ini mungkin memungkinkan Anda mengonfigurasi proyek Anda dengan benar. - person Cameron Lowell Palmer; 16.01.2015
comment
@GregEnnis Saya akan senang mendapatkan skor tertinggi. :) - person Cameron Lowell Palmer; 23.01.2015
comment
Saya mempunyai masalah: Android.plugin.ndkFolder mengembalikan 'null'. Bagaimana cara menentukan jalur ndk saya? Terima kasih. - person jmrodrigg; 27.01.2015
comment
Soal: Saya tidak menambahkan ndk.dir di properti lokal. Sekarang saya sedang menangani masalah Dukungan NDK saat ini sudah tidak digunakan lagi. - person jmrodrigg; 27.01.2015
comment
Itu tidak menjadi masalah. Itu adalah peringatan informasional. Google akhirnya dapat meningkatkan dukungan NDK. - person Cameron Lowell Palmer; 27.01.2015
comment
Terima kasih, Anda benar, masalahnya ada di tempat lain. Saya mengaktifkan stacktrace dan menyadari bahwa saya perlu menjalankan 'ndk-build.cmd'. Saya lupa memasang ekstensinya. Sekarang ini berfungsi dengan sempurna. - person jmrodrigg; 27.01.2015
comment
Ya. Sekarang saya sedang mencari sesuatu untuk menjalankan commandLine yang berbeda tergantung pada OS... ada ide? - person jmrodrigg; 28.01.2015
comment
@CameronLowellPalmer Terima kasih. - person jmrodrigg; 29.01.2015
comment
@jmrodrigg tidak ada yang terlintas dalam pikiran. Lintas platform itu sulit. Masalah terbesar yang akan Anda hadapi mungkin adalah menemukan alat yang diperlukan. Saya pikir pada titik tertentu diperlukan README dan intervensi pengguna. - person Cameron Lowell Palmer; 29.01.2015
comment
@jmrodrigg Anda dapat menggunakan org.apache.tools.ant.taskdefs.condition.Os, seperti yang saya lakukan di Intisari ini: gist.github.com/ph0b/9e59058ac59cac104398. Selain itu, jika ndk-build telah ditambahkan ke jalur pengguna, lokasinya tidak perlu ditentukan. - person ph0b; 27.04.2015
comment
:) Setelah Anda menggunakan semut, bukankah Anda gagal? - person Cameron Lowell Palmer; 28.04.2015
comment
Saya harus menambahkan def ndkDir = plugins.getPlugin('com.android.application').sdkHandler.ndkFolder agar bisa berfungsi - person SztupY; 15.06.2015
comment
Terima kasih SztupY! AStudio build 141.2006197 mengeluh tidak menemukan plugin. Saran Anda menyelesaikan masalah itu! - person Zoccadoum; 17.06.2015
comment
+1 untuk SztupY juga. Saya menggunakan plugin Android-gradle 1.2.3 & gradle 2.4, android.plugin.ndkFolder menghasilkan properti plugin tidak ditemukan. Saya sedang membangun perpustakaan sehingga plugins.getPlugin('com.android.library').sdkHandler.ndkFolder membantu. @SztupY, di mana Anda menemukan dokumentasi untuk plugin itu? Bagaimana Anda tahu properti apa saja yang ada di sana? - person Some Noob Student; 20.06.2015
comment
@SomeNoobStudent Saya baru saja mencari-cari di Google dan menemukan utas serupa di tempat lain. Apa yang mereka tulis tidak berhasil sama sekali, tetapi baris ini berguna di sini - person SztupY; 20.06.2015
comment
@CameronLowellPalmer - Ya, baris perintah (ndk_build.sh) berfungsi dengan baik tetapi gradle build mengeluh sampai saya menambahkan saran SztupY. - person Zoccadoum; 23.06.2015
comment
@CameronLowellPalmer Bagaimana cara mengubah solusi ini untuk menggunakan 'NDK_DEBUG=1' untuk tipe build debug dan 'NDK_DEBUG=0' untuk tipe build rilis? - person DeathlessHorsie; 26.07.2015
comment
@DeathlessHorsie salah satu caranya adalah dengan membuat dua tugas terpisah, Anda dapat menamainya buildNativeRelease dan buildNativeDebug misalnya. - person Cameron Lowell Palmer; 27.07.2015
comment
@CameronLowellPalmer ya, saya sudah mencobanya. Saya mencoba kode ini: task.whenTaskAdded { task -› if(task.getName().contains(generateReleaseSources)) { task.dependsOn buildNativeRelease } else if(task.getName().contains(generateDebugSources)) { task.dependsOn buildNativeDebug } } Saya melihat dua masalah: 1. ketika saya mengonfigurasi perpustakaan ke Debug, tugas rilis juga dijalankan. 2. ketika saya membangun setelah mengganti tipe build, kode asli tidak dikompilasi lagi sehingga file debug/rilis *.so tetap ada. Terkadang ia membangun kembali kode asli. - person DeathlessHorsie; 27.07.2015
comment
@DeathlessHorsie Coba ini: task.whenTaskAdded { task -› if (task.name == 'compileDebugNdk') { task.dependsOn buildNativeDebug } } Beri tahu saya jika berhasil. - person Cameron Lowell Palmer; 28.07.2015
comment
@CameronLowellPalmer membuat kompilasiDebugNdk bergantung pada buildNativeDebug sepertinya pilihan yang lebih baik daripada generateDebugSources. Namun, itu tidak menyelesaikan masalah saya. 1. Tampaknya ada batasan Android studio/gradle. Ada opsi untuk membuat modul tertentu dari menu konteks dalam tampilan proyek di studio. Opsi ini hanya menjalankan tugas debug. 2. Tampaknya ini merupakan batasan dari ndk-build. Ia tidak menyadari bahwa opsi NDK_DEBUG berubah. - person DeathlessHorsie; 28.07.2015
comment
@DeathlessHorsie seperti yang saya pahami, Anda telah menerapkan solusi di atas untuk kompilasiDebugNdk dan kompilasiReleaseNdk yang terpisah dengan tanda debug yang hilang untuk yang terakhir, tetapi masalahnya adalah solusi tersebut tidak dikompilasi ulang saat beralih antara debug dan rilis, benar? Anda dapat membuat bagian NDK selalu bersih sebelum dikompilasi, tidak ideal, tetapi ini adalah masalah yang sama jika Anda mencoba hal serupa pada baris perintah dengan make. BTW saya kompilasi menggunakan ./gradlew assembleDebug atau assembleRelease - person Cameron Lowell Palmer; 28.07.2015
comment
@CameronLowellPalmer terima kasih saya memperbarui build dan tampaknya berfungsi dengan benar. - person Zoccadoum; 30.07.2015
comment
Bagaimana cara mendefinisikan sourceSets.main ketika saya menggunakan plugin eksperimental? - person Shailen; 30.10.2015
comment
Anda, Tuan, berhak mendapatkan kue! - person dbm; 20.12.2015
comment
Komentar This is not necessary unless you have precompiled libraries in your project. menyesatkan. Saya harus menambahkannya, atau jika tidak, objek bersama yang dihasilkan tidak akan masuk ke file apk akhir. - person Torsten Robitzki; 29.01.2016
comment
Anda dapat menemukan direktori NDK melalui variabel lingkungan NDK_ROOT_DIRCTORY. Jika Android Studio mengabaikan nilainya maka Anda harus mengajukan laporan bug. - person jww; 15.10.2016
comment
@jww Anda harus meningkatkan ke 2.2.1 dan melupakan NDK_ROOT_DIRECTORY. - person Cameron Lowell Palmer; 15.10.2016
comment
@CameronLowellPalmer - Sejauh yang saya tahu, tim NDK masih merekomendasikannya. Jika Android Studio mengabaikannya, ajukan laporan bug. Kedengarannya seperti Android Studio hanya membuat omong kosong seiring berjalannya waktu. - person jww; 15.10.2016
comment
@jww sebenarnya, saya melakukan sebagian besar kompilasi melalui gradle lurus pada baris perintah. Plugin android gradle 2.2.1 menyelesaikan sebagian besar masalah terkait NDK yang memaksa Anda memanggil ndk-build secara manual dan menambahkan dukungan cmake. - person Cameron Lowell Palmer; 15.10.2016
comment
daripada menyembunyikan sumber C++, saya lebih suka menonaktifkan tugas compliexxxNdk, dengan menambahkan pesona berikut di build.gradle: tasks.all { task -> if (task.name.contains('compileDebugNdk') || task.name.contains('compileReleaseNdk')) { task.enabled = false } } - person Alex Cohn; 07.12.2016
comment
@AlexCohn kehilangan konteks komentar itu - person Cameron Lowell Palmer; 07.12.2016
comment
Saya menonaktifkan tugas ini alih-alih menulis sourceSets.main { jni.srcDirs = [] }, lihat stackoverflow.com/a/32640823/192373 - person Alex Cohn; 07.12.2016
comment
@AlexCohn ah, ya. Namun, hal itu tidak diperlukan lagi jika Anda meningkatkan ke alat build ke 2.2.x+ - person Cameron Lowell Palmer; 07.12.2016
comment
Masih ada situasi ketika externalNativeBuild tidak dapat digunakan - person Alex Cohn; 07.12.2016
comment
@AlexCohn ya, saya yakin. Hanya saja kebanyakan orang mungkin tidak memerlukan hal lain dan ini adalah jalan ke depan! :) - person Cameron Lowell Palmer; 07.12.2016

gradle mendukung kompilasi ndk dengan membuat file Android.mk lain dengan jalur absolut ke sumber Anda. NDK mendukung jalur absolut sejak r9 di OSX, r9c di Windows, jadi Anda perlu mengupgrade NDK ke r9+.

Anda mungkin mengalami masalah lain karena dukungan NDK secara bertahap masih bersifat awal. Jika demikian, Anda dapat menonaktifkan kompilasi ndk dari gradle dengan mengatur:

sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}

untuk dapat memanggil ndk-build sendiri dan mengintegrasikan libs dari libs/.

btw, Anda mengalami masalah saat kompilasi untuk x86? Saya melihat Anda belum memasukkannya ke dalam APP_ABI Anda.

person ph0b    schedule 14.01.2014
comment
Jawaban yang bagus! Anda membuat hari saya menyenangkan! =) solusi lain, hanya saja saya belum menemukannya. - person Vlad Hudnitsky; 03.02.2014
comment
Saya sendiri mengalami masalah yang sama. Saya menyelesaikannya dengan menambahkan file .c kosong ke dalam direktori ./app/src/main/jni (saya menamai file tersebut utils.c, tetapi Anda dapat menyebutnya apa pun yang Anda suka...). Sejak saat itu, semuanya berfungsi dengan baik. Saya tidak mengubah apa pun pada file pengaturan Gradle. - person GeertVc; 17.09.2014
comment
Saya harus meletakkan ini di bawah orang tua mana? Saya sudah mencoba beberapa tempat dan saya tidak dapat menyelesaikan simbol: jni. - person Andrew Wyld; 19.01.2015
comment
Anda harus meletakkannya di bawah android { } - person ph0b; 20.01.2015
comment
Itu berhasil untuk saya. Bisakah seseorang tolong jelaskan jawabannya secara detail? - person Amit Gupta; 06.07.2015
comment
Anda bisa mendapatkan detail lebih lanjut dari artikel saya: ph0b.com/android-studio- integrasi gradle-dan-ndk - person ph0b; 06.07.2015

Dalam kasus saya, saya menggunakan Windows dan mengikuti jawaban Cameron di atas hanya berfungsi jika Anda menggunakan nama lengkap ndk-build yaitu ndk-build.cmd. Saya harus membersihkan dan membangun kembali proyek, lalu memulai ulang emulator sebelum aplikasi dapat berfungsi (Sebenarnya saya mengimpor sampel HelloJni dari NDK, ke Android Studio). Namun, pastikan jalur ke NDK tidak berisi spasi.

Akhirnya, build.gradle saya tercantum lengkap seperti di bawah ini:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.hellojni"
        minSdkVersion 4
        targetSdkVersion 4

        ndk {
            moduleName "hello-jni"
        }

        testApplicationId "com.example.hellojni.tests"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    sourceSets.main {
        jni.srcDirs = [] // This prevents the auto generation of Android.mk
//        sourceSets.main.jni.srcDirs = []
        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.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build.cmd",
                '-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.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build.cmd",
                '-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:21.0.3'
}
person Brian Ng    schedule 09.03.2015
comment
Ekstensi file! Harus menyukai Windows. - person Cameron Lowell Palmer; 21.12.2015
comment
Apa yang ada di dalam src/main/libs? Bagaimana jika subdirektori lain seperti armeabi - person IgorGanapolsky; 11.05.2016
comment
Daftar file .so yang mungkin saya tambahkan, di proyek saya sebelumnya adalah lib opencv untuk Android. - person Brian Ng; 14.05.2016
comment
Anda dapat menemukan direktori NDK melalui variabel lingkungan NDK_ROOT_DIRCTORY. Jika Android Studio mengabaikan nilainya maka Anda harus mengajukan laporan bug. - person jww; 15.10.2016

Android Studio 2.2 hadir dengan kemampuan untuk menggunakan ndk-build dan cMake. Meskipun begitu, kami harus menunggu hingga versi 2.2.3 untuk mendapatkan dukungan Application.mk. Saya sudah mencobanya, berhasil...meskipun, variabel saya tidak muncul di debugger. Saya masih bisa menanyakannya melalui baris perintah.

Anda perlu melakukan sesuatu seperti ini:

externalNativeBuild{
   ndkBuild{
        path "Android.mk"
    }
}

defaultConfig {
  externalNativeBuild{
    ndkBuild {
      arguments "NDK_APPLICATION_MK:=Application.mk"
      cFlags "-DTEST_C_FLAG1"  "-DTEST_C_FLAG2"
      cppFlags "-DTEST_CPP_FLAG2"  "-DTEST_CPP_FLAG2"
      abiFilters "armeabi-v7a", "armeabi"
    }
  } 
}

Lihat http://tools.android.com/tech-docs/external-c-builds

NB: Penyusunan tambahan externalNativeBuild di dalam defaultConfig merupakan perubahan besar yang diperkenalkan pada Android Studio 2.2 Pratinjau 5 (8 Juli 2016). Lihat catatan rilis di tautan di atas.

person Ronnie    schedule 16.06.2016
comment
Bisakah Anda menjelaskan lebih lanjut, kami harus menunggu hingga 2.2.3 untuk dukungan Application.mk? Apakah itu Pratinjau3, atau..? - person Sebastian Roth; 30.06.2016
comment
@SebastianRoth : Ya itu adalah pratinjau 3. Mulai hari ini 8 Agustus 2015, Android Studio 2.2 Beta telah dirilis yang menyediakan dukungan untuk build asli eksternal. - person Vyshakh Amarnath; 10.08.2016

Masalah saya di OSX adalah versi gradle. Gradle mengabaikan Android.mk saya. Jadi, untuk mengesampingkan pilihan ini, dan menggunakan make saya sebagai gantinya, saya telah memasukkan baris ini:

sourceSets.main.jni.srcDirs = []

di dalam tag android di build.gradle.

Saya telah membuang banyak waktu untuk hal ini!

person Paschalis    schedule 26.02.2014
comment
Saya tidak mengerti, karena @CameronLowellPalmer telah menentukan hal ini. Atau apakah gradle menafsirkan sourceSets.main { jni.srcDirs = [] } dengan cara yang berbeda dari sourceSets.main.jni.srcDirs = []? Saya yakin masalah Anda ada di tempat lain dan Anda tidak sengaja memperbaikinya. - person Oliver Hausler; 11.01.2015
comment
@OliverHausler kedua pernyataan itu setara. - person Cameron Lowell Palmer; 26.01.2015

Di modul build.gradle, di bidang tugas, saya mendapatkan kesalahan kecuali saya menggunakan:

def ndkDir = plugins.getPlugin('com.android.application').sdkHandler.getNdkFolder()

Saya melihat orang-orang menggunakan

def ndkDir = android.plugin.ndkFolder

Dan

def ndkDir = plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()

tetapi tidak satu pun yang berfungsi sampai saya mengubahnya ke plugin yang sebenarnya saya impor.

person videogameboy76    schedule 26.06.2015
comment
Anda dapat menemukan direktori NDK melalui variabel lingkungan NDK_ROOT_DIRCTORY. Jika Android Studio mengabaikan nilainya maka Anda harus mengajukan laporan bug. - person jww; 15.10.2016