2014-04-28 17 views
5

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?

Antwort

7

Ich habe es endlich herausgefunden! Sie müssen das neueste NDK für die neuere Gradle NDK-Unterstützung verwenden. Meine local.properties (und meine ~/.bashrc) zeigten auf android-ndk-r8e, um die defekte gdb-server-Unterstützung in android-ndk-r9d zu umgehen, aber als ich auf android-ndk-r9d aktualisiert habe, begann mein gradle-Build zu arbeiten ohne die zusätzlichen Hacks. Das obige Beispiel funktioniert so lange, wie Ihre local.properties auf Version 9b + des NDK verweist.

Verwandte Themen