Ich habe versucht, auf einem Gradle verwalteten Android-Projekt zu hacken, das JNI verwendet, und ich habe ein bisschen Ärger. Ich verstehe, dass der NDK-Support immer noch relativ neu und größtenteils undokumentiert ist, aber ich habe es geschafft, die grundlegenden Elemente für den Shoe-Horning in einem Gradle Build zu finden. Anscheinend ist der Trick ist, alle Ihre nativen Code unter src/main/jni
und legen Sie die folgenden in einem Ihrer configs (zB im defaultConfig
Block) enthalten:NDK Dev in einem Android-Bibliotheksprojekt mit Gradle & Android Studio
ndk {
moduleName "mylib"
}
Das Problem ist, dass wenn ich versuche, mein Projekt zu bauen, die Das ndk-Plugin erzeugt eine Android.mk-Datei, die absolute Pfade zur nativen Quelle enthält. Dies bewirkt, dass make
erstickt, während STILL die Pfade als relativ betrachtet. In meinem Fall habe ich eine einfache Bibliotheksprojekt mit 1 cav Quelle/header-Combo unter src/main/jni
und ich verwende diese gradle.build
:
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 9
targetSdkVersion 19
versionCode 1
versionName "1.0"
ndk {
moduleName "mylib"
}
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
}
die Build-Rennen generiert diese Android.mk unter build/NDK/debug:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/Android.mk \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/debug/jni
include $(BUILD_SHARED_LIBRARY)
..., die bei der Ausführung dieser Fehler erzeugt:
make: *** No rule to make target `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp', needed by `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/obj/local/armeabi-v7a/objs/mylib//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.o'. Stop.
..., weil die absoluten Pfade relativ irrtümlich umgewandelt werden. Wenn ich die Datei manuell bearbeiten und die Pfade wie so zu relativ ändern:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
../../../src/main/jni/Android.mk \
../../../src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += ../../../src/main/jni
LOCAL_C_INCLUDES += ../../../src/debug/jni
include $(BUILD_SHARED_LIBRARY)
... dann bekomme ich diese Fehlermeldung:
/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/../../../src/main/jni/com_craig_multiandroid_app_NativeSectionTextProvider.h:2:17: fatal error: jni.h: No such file or directory
Meine Frage ist, was kann ich dieses Problem beheben zu tun? Ich habe angefangen, meine eigene benutzerdefinierte Unterstützung für .aar-Builds zu hacken, bin aber dabei verloren, herauszufinden, welcher Gradle-Task für die Erstellung der .aar-Datei verantwortlich ist. (Die Gradle-Dokumentation macht es zwar reichlich, aber es ist schwierig, die Details zu einer bestimmten Android Gradle-Task-API zu finden.) Ich habe ein partiell funktionierendes gradle.build, das ndk-build über die cmd-Zeile ausführt, das .so generiert, aber ich kann ' Ich finde heraus, wie (oder sogar wenn ich sollte) die .so innerhalb des .aar. Ich benutze Android Studio 0.5.7 und Gradle 1.11. Ich habe Gradle Quelle vor ein paar Monaten gezogen, so wie ich herausgefunden habe, wie die .so und gdbserver Dateien in einem normalen .apk Projekt eingebunden werden, aber diese Regeln scheinen nicht für .aar Projekte zu gelten. Hat jemand anderes das versucht? Wo kann ich nach Antworten suchen?