Saya sangat baru dengan dukungan seluruh kelas dan Android Studio ini. Saya telah berhasil mengonversi proyek android saya menjadi bertahap menggunakan opsi ekspor.
Tetapi saya mencari beberapa dokumentasi atau titik awal bagaimana mengintegrasikan NDK build ke dalam proses gradle build.
Jika memungkinkan saya juga memerlukan semacam tahap "setelah" yang menyalin binari build (file .so) ke direktori aset.
android
android-ndk
gradle
android-studio
plaisthos
sumber
sumber
Jawaban:
Kami telah merilis versi pertama integrasi sebagai pratinjau di 1.3: http://tools.android.com/tech-docs/android-ndk-preview
Integrasi akan tetap menjadi pratinjau bahkan setelah 1,3 menjadi final. Tidak ada ETA saat ini tentang kapan akan final (per 2015/07/10).
Informasi lebih lanjut di sini: http://tools.android.com/tech-docs/android-ndk-preview
sumber
UPDATE: Android Studio dengan dukungan NDK sudah keluar sekarang: http://tools.android.com/tech-docs/android-ndk-preview
Untuk membangun dengan skrip, solusi gradle di bawah ini harus berfungsi:
Saya menggunakan skrip build saya dan ditambahkan ke file saya (Tampaknya berfungsi untuk
0.8+
): Ini tampaknya setara dengan solusi di bawah ini (tetapi terlihat lebih bagus di file gradle):Sayangnya, build tidak gagal jika direktori tidak ada atau tidak mengandung
.so
file.sumber
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Terima kasih kawan atas bantuannya!jni.srcDirs = [] //disable automatic ndk-build
sangat penting karena akan mencegah Android Studio membangun kembali kode sumber C / C ++. Saya telah mencoba mencari tahu ini selama dua hari sampai saya melihat posting Anda dan ini menyelesaikan masalah saya. Saya benar-benar berpikir NDK build lebih baik dibangun secara terpisah oleh makefile command line Android.mk saja, bukan dengan skrip gradle karena C / C ++ telah dibangun oleh Makefile selama lebih dari 40 tahun!Dengan pembaruan Android Studio ke 1.0, dukungan toolchain NDK meningkat pesat ( catatan: baca pembaruan saya di bagian bawah posting ini untuk melihat penggunaan dengan plugin Gradle eksperimental baru dan Android Studio 1.5 ).
Android Studio dan NDK terintegrasi cukup baik sehingga Anda hanya perlu membuat blok ndk {} di build.gradle modul Anda, dan mengatur file sumber Anda ke dalam direktori (module) / src / main / jni - dan Anda selesai!
Tidak ada lagi ndk-build dari baris perintah.
Saya sudah menulis semua itu di posting blog saya di sini: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Poin yang menonjol adalah:
dan letakkan ini di build.gradle modul Anda:
Itulah proses mengkompilasi kode C ++ Anda, dari sana Anda perlu memuatnya, dan membuat pembungkus - tetapi menilai dari pertanyaan Anda, Anda sudah tahu bagaimana melakukan semua itu, jadi saya tidak akan memotong kembali.
Juga, saya telah menempatkan repo Github dari contoh ini di sini: http://github.com/sureshjoshi/android-ndk-swig-example
PEMBARUAN: 14 Juni 2015
Ketika Android Studio 1.3 keluar, harus ada dukungan yang lebih baik untuk C ++ melalui plugin JetBrains CLion. Saya saat ini dengan asumsi bahwa ini akan memungkinkan pengembangan Java dan C ++ dari dalam Android Studio; namun saya pikir kita masih harus menggunakan bagian Gradle NDK seperti yang telah saya nyatakan di atas. Selain itu, saya pikir masih akan ada kebutuhan untuk menulis file wrapper Java <-> C ++, kecuali CLion akan melakukannya secara otomatis.
PEMBARUAN: 5 Januari 2016
Saya telah memperbarui blog saya dan repo Github (di cabang pengembangan) untuk menggunakan Android Studio 1.5 dengan plugin Gradle eksperimental terbaru (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example
Bangunan Gradle untuk bagian NDK sekarang terlihat seperti ini:
Selain itu, cukup mengagumkan, Android Studio memiliki pelengkapan otomatis untuk C ++ - pembungkus yang dihasilkan Java menggunakan kata kunci 'asli':
Namun, itu tidak sepenuhnya menyenangkan ... Jika Anda menggunakan SWIG untuk membungkus pustaka untuk menghasilkan kode secara otomatis, dan kemudian mencoba menggunakan pembuatan kata kunci asli bawaan, itu akan menempatkan kode di tempat yang salah di Swig Anda _wrap File .cxx ... Jadi Anda perlu memindahkannya ke blok "extern C":
PEMBARUAN: 15 Oktober 2017
Saya akan lalai jika saya tidak menyebutkan bahwa Android Studio 2.2 dan seterusnya pada dasarnya memiliki dukungan 'asli' (tanpa kata-kata) untuk toolchain NDK melalui Gradle dan CMake. Sekarang, ketika Anda membuat proyek baru, cukup pilih dukungan C ++ dan Anda siap melakukannya.
Anda masih perlu membuat kode layer JNI Anda sendiri, atau menggunakan teknik SWIG yang saya sebutkan di atas, tetapi perancah C ++ dalam proyek Android sepele sekarang.
Perubahan pada file CMakeLists (yang merupakan tempat Anda meletakkan file sumber C ++) akan diambil oleh Android Studio, dan itu akan secara otomatis mengkompilasi ulang pustaka terkait.
sumber
Di Google IO 2015, Google mengumumkan integrasi penuh NDK di Android Studio 1.3.
Sekarang sudah keluar dari pratinjau, dan tersedia untuk semua orang: https://developer.android.com/studio/projects/add-native-code.html
Jawaban lama: Gradle secara otomatis menelepon
ndk-build
jika Anda memilikijni
direktori di sumber proyek Anda.Ini bekerja di Android studio 0.5.9 (canary build).
Unduh NDK
Tambahkan
ANDROID_NDK_HOME
ke variabel lingkungan Anda atau tambahkanndk.dir=/path/to/ndk
ke Andalocal.properties
di proyek Android Studio Anda. Ini memungkinkan Android studio untuk menjalankan ndk secara otomatis.Unduh proyek sampel gradle terbaru untuk melihat contoh proyek ndk. (Mereka ada di bagian bawah halaman). Proyek sampel yang bagus adalah
ndkJniLib
.Salin
gradle.build
dari proyek sampel NDK. Ini akan terlihat seperti ini. Inigradle.build
menciptakan apk yang berbeda untuk setiap arsitektur. Anda harus memilih arsitektur yang Anda inginkan menggunakanbuild variants
panel.Perhatikan bahwa ini akan mengabaikan file Android.mk dan Application.mk Anda. Sebagai solusinya, Anda dapat memberitahu gradle untuk menonaktifkan panggilan ndk-build otomatis, lalu tentukan direktori untuk sumber ndk secara manual.
Selain itu, Anda mungkin ingin memanggil ndk-build di skrip gradle build Anda secara eksplisit, karena Anda baru saja menonaktifkan panggilan otomatis.
sumber
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
Saya menemukan "gradle 1.11 com.android.tools.build:gradle/0.9.+" mendukung pre-build ndk sekarang, Anda cukup meletakkan * .so di dir src / main / jniLibs. ketika membangun gradle akan mengemas ndk ke tempat yang tepat.
ini proyek saya
sumber
Seperti yang dikatakan Xavier, Anda dapat meletakkan prebuilt di / src / main / jniLibs / jika Anda menggunakan gradle 0.7.2+
diambil dari: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
sumber
Sampai sekarang (Android Studio v0.8.6) cukup sederhana. Berikut adalah langkah-langkah untuk membuat aplikasi jenis "Hello world":
Unduh Android NDK dan letakkan folder root di tempat yang waras - di lokasi yang sama dengan folder SDK, mungkin.
Tambahkan yang berikut ke
local.properties
file Anda :ndk.dir=<path-to-ndk>
Tambahkan berikut ini ke file build.gradle Anda di dalam
defaultConfig
penutupan, tepat setelahversionName
baris:ndk { moduleName="hello-world" }
Di
main
direktori modul aplikasi Anda , buat folder baru bernamajni
.Di folder itu, buat file bernama
hello-world.c
, yang akan Anda lihat di bawah.Lihat contoh
Activity
kode di bawah ini untuk contoh bagaimana memanggil metode (atau itu fungsi?) Dihello-world.c
.hello-world.c
MainActivity.java
build.gradle
Temukan kode sumber lengkap dari aplikasi yang sangat mirip di sini (minus NDK).
sumber
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
ke milik Anda sendiri :)Jika Anda berada di unix versi terbaru (0.8) menambahkan ndk-build. Berikut cara menambahkannya:
Ia mengharapkan untuk menemukan JNI di bawah 'src / main / jni', jika tidak Anda dapat mendefinisikannya dengan:
Mulai 28 JAN 2014 dengan versi 0.8 build rusak di windows, Anda harus menonaktifkan build dengan:
sumber
Solusi yang elegan ditunjukkan di https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
Pada dasarnya Anda membuat toples yang berisi "lib / armeabi / yourlib.so" dan kemudian memasukkan toples ke dalam build.
sumber
ndk-build
, menghasilkan.jar
s untuk masing-masing.so
dan menempatkannya di jalur build gradle untuk mengurangi rasa sakit ini. Saksikan berikut ini.Jawaban yang bagus mengotomatiskan pengemasan
.so
file-file yang siap dikompilasi diberikan dalam utas lain (tertutup) . Untuk membuatnya bekerja, saya harus mengubah jalur:ke:
Tanpa perubahan ini,
.so
file tidak ditemukan, dan tugas untuk mengemasnya tidak akan pernah berjalan.sumber
Jawaban dari @plaisthos pecah di versi gradle terbaru, tetapi masih ada cara untuk melakukannya. Buat
native-libs
direktori di root direktori proyek Anda dan salin semua lib kami ke direktori ini.Tambahkan baris berikut ke build.gradle Anda. Bangun dan bahagia.
sumber
Ini adalah kode yang saya gunakan untuk membangun menggunakan android-ndk dari gradle. Untuk ini tambahkan jalur direktori ndk di
gradle.properties
mis. menambahkanndkdir=/home/user/android-ndk-r9d
dan menempatkan semua file JNI dalam foldernative
disrc/main/
seperti yang Anda lihat dari kode diposting di bawah ini. Ini akan membuat jar dengan lib asli yang dapat Anda gunakan secara normal seperti padaSystem.loadLibrary("libraryname");
sumber
Saya telah menggunakan kode berikut untuk mengkompilasi pustaka dropbox asli, saya menggunakan Android Studio v1.1.
sumber
Saya telah menggunakan
ndk.dir=/usr/shareData/android-ndk-r11b
// path ndkdalam file local.properties di proyek android studio. dan tambahkan baris ini:
android.useDeprecatedNdk=true
dalam file gradle.properties di proyek android studio.
Informasi lebih lanjut di sini: http://tools.android.com/tech-docs/android-ndk-preview
sumber
Untuk memperluas apa yang dikatakan Naxos (Terima kasih Naxos karena mengirim saya ke arah yang benar!), Saya belajar sedikit dari contoh NDK yang baru dirilis dan memposting jawaban dalam pertanyaan serupa di sini.
Cara mengkonfigurasi NDK dengan plugin Android Gradle 0.7
Posting ini memiliki detail lengkap tentang menautkan pustaka asli prebuilt ke aplikasi Anda untuk berbagai arsitektur serta informasi tentang cara menambahkan dukungan NDK langsung ke skrip build.gradle. Untuk sebagian besar, Anda tidak perlu melakukan pekerjaan di sekitar zip dan salin lagi.
sumber
Berikut adalah langkah-langkah yang saya gunakan untuk membuat NDK bekerja di proyek Android Studio saya. Saya menggunakan tutorial ini untuk membantu saya https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
Untuk menggunakan NDK, Anda harus menambahkan baris NDK ke local.properties. Jadi di bawah sdk.dir Anda tambahkan
Di aplikasi saya build.gradle saya memiliki kode berikut
moduleName adalah nama yang ingin Anda berikan kode asli Anda. Saya percaya inilah yang akan disebut perpustakaan bersama. ldLibs memungkinkan saya untuk masuk ke LogCat, stl adalah stl yang ingin Anda impor. Ada banyak opsi, sama seperti Eclipse NDK. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
cFlags masih merupakan sihir hitam bagi saya. Saya belum menemukan sumber yang bagus untuk semua opsi dan apa yang mereka berikan kepada saya. Cari di sekitar StackOverflow untuk apa pun yang Anda butuhkan, di situlah saya menemukannya. Saya tahu bahwa c ++ 11 memungkinkan saya untuk menggunakan standar c ++ 11 yang baru.
Berikut adalah contoh bagaimana saya masuk ke LogCat dari kode asli
sumber
konfigurasikan proyek di studio android dari eclipse: Anda harus mengimpor proyek eclipse ndk ke studio android tanpa mengekspor ke gradle dan berfungsi, Anda juga perlu menambahkan jalur ndk di local.properties , jika ada kesalahan, tambahkan
dalam file build.gradle kemudian buat folder jni dan file menggunakan terminal dan jalankan itu akan bekerja
sumber
Sekarang Android Studio berada di saluran stabil, cukup mudah untuk menjalankan sampel android-ndk . Sampel ini menggunakan plugin eksperimental ndk dan lebih baru daripada yang ditautkan dari dokumentasi online Android NDK. Setelah Anda tahu mereka berfungsi, Anda dapat mempelajari file build.gradle, local.properties, dan gradle-wrapper.properties dan memodifikasi proyek Anda sesuai dengan itu. Berikut ini adalah langkah-langkah untuk membuatnya bekerja.
Buka pengaturan, Penampilan & Perilaku, Pengaturan Sistem, Android SDK, pilih tab SDK Tools, dan periksa Android NDK versi 1.0.0 di bagian bawah daftar. Ini akan mengunduh NDK.
Arahkan ke lokasi NDK yang baru diunduh. Perhatikan bahwa itu akan ditempatkan di direktori sdk / ndk-bundle. Lakukan ini dengan memilih File, Struktur Proyek, Lokasi SDK (di sebelah kiri), dan menyediakan jalur di bawah lokasi Android NDK. Ini akan menambahkan entri ndk ke local.properties mirip dengan ini:
Saya telah berhasil membangun dan menggunakan semua proyek dalam repositori dengan cara ini, kecuali gles3gni, native-codec dan builder. Saya menggunakan yang berikut ini:
Android Studio 1.3 build AI-141.2117773
sampel android-ndk yang diterbitkan 28 Juli 2015 (tautan di atas)
SDK Tools 24.3.3
NDK r10e diekstraksi ke C: \ Android \ sdk \ ndk-bundle
Plugin Gradle 2.5
Gradle 0.2.0
Windows 8.1 64 bit
sumber
NDK Build dan gradle (dasar)
Secara umum membangun dengan NDK adalah sesederhana dengan benar menentukan jalur ndkBuild ke Android.mk atau cmake path ke CMakeLists.txt. Saya merekomendasikan CMake pada Android.mk yang lebih lama karena dukungan Android Studio C / C ++ didasarkan pada CLion dan menggunakan CMake sebagai format proyeknya. Ini dalam pengalaman saya cenderung membuat IDE lebih responsif pada proyek yang lebih besar. Semua yang dikompilasi dalam proyek Anda akan dibangun dan disalin ke APK secara otomatis.
Menambahkan perpustakaan prebuilt ke proyek (lanjutan)
Pustaka statis (.a) di build NDK Anda akan secara otomatis disertakan, tetapi pustaka dinamis prebuilt (.so) perlu ditempatkan
jniLibs
. Ini dapat dikonfigurasi menggunakansourceSets
, tetapi Anda harus mengadopsi standar. Anda TIDAK PERLU perintah tambahan apa punbuild.gradle
saat menyertakan pustaka prebuilt.Tata letak
jniLibs
Anda dapat menemukan informasi lebih lanjut tentang struktur di Panduan Pengguna Plugin Android Gradle .
Anda kemudian dapat memvalidasi APK yang dihasilkan berisi file .so Anda, biasanya di bawah
build/outputs/apk/
, gunakanunzip -l myApp.apk
untuk membuat daftar konten.Membangun perpustakaan bersama
Jika Anda sedang membangun perpustakaan bersama di NDK Anda tidak perlu melakukan apa pun lebih lanjut. Ini akan dibundel dengan benar di APK.
sumber
Cukup tambahkan baris ini ke aplikasi
build.gradle
sumber
sekarang. Saya dapat memuat begitu sukses!
1. Tambahkan file .so ke jalur ini
| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | --armeabi | - | - | - | - | -. jadi file
2. tambahkan kode ini ke gradle.build
}
3.
System.loadLibrary("yousoname");
sumber
Jika proyek Anda diekspor dari eclipse, tambahkan kode di bawah ini dalam file gradle :
2.Jika Anda membuat proyek di Android studio:
buat folder bernama jniLibs di src / main / , dan letakkan file * .so Anda di folder jniLibs.
Dan salin kode seperti di bawah ini dalam file gradle Anda :
sumber
Walaupun saya percaya SJoshi (oracle guy) memiliki jawaban paling lengkap, proyek SWIG adalah kasus khusus, menarik dan bermanfaat, pada saat itu, tetapi tidak digeneralisasi untuk sebagian besar proyek yang telah berhasil dengan baik dengan proyek standar semut SDK + NDK. Kita semua ingin menggunakan studio Android sekarang kemungkinan besar, atau menginginkan toolchain build CI yang lebih ramah untuk seluler, yang secara gradual menawarkan.
Saya telah memposting pendekatan saya, dipinjam dari suatu tempat (saya menemukan ini di SO, tetapi memposting inti untuk build.gradle aplikasi: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). Singkatnya, saya merekomendasikan yang berikut ini:
Gradle untuk Android telah mengacaukan pendapat saya, sama seperti saya suka konsep pakar pinjaman dan struktur direktori untuk proyek. Fitur NDK ini telah "segera hadir" selama hampir 3+ tahun.
sumber