2015-03-03 17 views
5

Jestem w trakcie migracji biblioteki Androida z Eclipse do Android Studio. W Eclipse mogę ustawić NDK_MODULE_PATH za pomocą Project> Properties> Resource> Linked Resources> Path Variables. Ale w jaki sposób osiągnąć to samo w Android Studio odpowiednio ze stopniem?Jak ustawić NDK_MODULE_PATH w Android Studio i/lub gradle?

Moja biblioteka kompiluje się, dopóki nie spróbuje znaleźć nagłówków dla modułu pod NDK_MODULE_PATH.

Oto komunikat błędu:

 
Executing tasks: [:libAndroid:compileDebugSources, :physicaloidLibrary:compileDebugSources] 

Configuration on demand is an incubating feature. 
:libAndroid:preBuild UP-TO-DATE 
:libAndroid:preDebugBuild UP-TO-DATE 
:libAndroid:checkDebugManifest 
:libAndroid:preDebugAndroidTestBuild UP-TO-DATE 
:libAndroid:preReleaseBuild UP-TO-DATE 
:physicaloidLibrary:compileLint 
:physicaloidLibrary:copyReleaseLint UP-TO-DATE 
:physicaloidLibrary:mergeReleaseProguardFiles UP-TO-DATE 
:physicaloidLibrary:preBuild UP-TO-DATE 
:physicaloidLibrary:preReleaseBuild UP-TO-DATE 
:physicaloidLibrary:checkReleaseManifest 
:physicaloidLibrary:prepareReleaseDependencies 
:physicaloidLibrary:compileReleaseAidl UP-TO-DATE 
:physicaloidLibrary:compileReleaseRenderscript UP-TO-DATE 
:physicaloidLibrary:generateReleaseBuildConfig UP-TO-DATE 
:physicaloidLibrary:generateReleaseAssets UP-TO-DATE 
:physicaloidLibrary:mergeReleaseAssets UP-TO-DATE 
:physicaloidLibrary:generateReleaseResValues UP-TO-DATE 
:physicaloidLibrary:generateReleaseResources UP-TO-DATE 
:physicaloidLibrary:packageReleaseResources UP-TO-DATE 
:physicaloidLibrary:processReleaseManifest UP-TO-DATE 
:physicaloidLibrary:processReleaseResources UP-TO-DATE 
:physicaloidLibrary:generateReleaseSources UP-TO-DATE 
:physicaloidLibrary:compileReleaseJava UP-TO-DATE 
:physicaloidLibrary:processReleaseJavaRes UP-TO-DATE 
:physicaloidLibrary:packageReleaseJar UP-TO-DATE 
:physicaloidLibrary:compileReleaseNdk UP-TO-DATE 
:physicaloidLibrary:packageReleaseJniLibs UP-TO-DATE 
:physicaloidLibrary:packageReleaseLocalJar UP-TO-DATE 
:physicaloidLibrary:packageReleaseRenderscript UP-TO-DATE 
:physicaloidLibrary:bundleRelease UP-TO-DATE 
:libAndroid:prepareLibAndroidGradlePhysicaloidLibraryUnspecifiedLibrary UP-TO-DATE 
:libAndroid:prepareDebugDependencies 
:libAndroid:compileDebugAidl UP-TO-DATE 
:libAndroid:compileDebugRenderscript UP-TO-DATE 
:libAndroid:generateDebugBuildConfig UP-TO-DATE 
:libAndroid:generateDebugAssets UP-TO-DATE 
:libAndroid:mergeDebugAssets UP-TO-DATE 
:libAndroid:generateDebugResValues UP-TO-DATE 
:libAndroid:generateDebugResources UP-TO-DATE 
:libAndroid:mergeDebugResources UP-TO-DATE 
:libAndroid:processDebugManifest UP-TO-DATE 
:libAndroid:processDebugResources UP-TO-DATE 
:libAndroid:generateDebugSources UP-TO-DATE 
:libAndroid:compileDebugJava UP-TO-DATE 
:libAndroid:compileDebugNdk 
AGPBI: {"kind":"SIMPLE","text":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory","position":{},"original":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory"} 
AGPBI: {"kind":"SIMPLE","text":" #include \u003cdmtx.h\u003e","position":{},"original":" #include \u003cdmtx.h\u003e"} 
AGPBI: {"kind":"SIMPLE","text":"     ^","position":{},"original":"     ^"} 
AGPBI: {"kind":"SIMPLE","text":"compilation terminated.","position":{},"original":"compilation terminated."} 
AGPBI: {"kind":"SIMPLE","text":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1","position":{},"original":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1"} 


FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':libAndroid:compileDebugNdk'. 
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/opt/android-ndk/ndk-build'' finished with non-zero exit value 2 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Total time: 2.763 secs 

Wszelkie pomysły na to?

Odpowiedz

-1

W katalogu głównym projektu Android Studio znajduje się plik o nazwie "local.properties". Dodaj właściwość o nazwie "ndk.dir" i ustaw wartość, aby wskazywała lokalizację ndk. Coś jak poniżej:

ndk.dir=/Users/username/sdk 

Może nie rozumiem twojego pytania. Jeśli już ustawiłeś lokalizację ndk i chcesz tylko upewnić się, że moduł zostanie zbudowany, dodaj moduł do pliku "settings.gradle".

include ":<your module name>" 

Następnie upewnij się, że umieściłeś kod C w "src/main/jni" w module. Gradle znajdzie go automatycznie na podstawie nazwy folderu. Nie ma już potrzeby ustawiania NDK_MODULE_PATH.

+0

Myślę, że dobrze mnie zrozumiałeś, ale po prostu wyjaśnić: różne zastosowania terminu "moduł", moduł pod $ NDK_MODULE_PATH to moduł/biblioteka C/C++. Stworzyłem moduł gradle w moim projekcie bibliotecznym. Ale pliki make "Android.mk" są ignorowane. W Internecie jest kilka postów dotyczących tego tematu. Ale jeśli ktoś polega na tych plikach Makefile, kompilacja biblioteki C/C++ może się nie powieść. E.g. "libdmtx": Musiałem tylko dodać "dmtx.c" do pliku makefile i pomyślnie go skompilowałem. Bez plików Makefile ndk-build próbuje skompilować każdy plik, którego nie powiedzie się. – rhodo

0

Zastosowanie: wersja

  • Gradle: 3.3
  • Android Wersja wtyczki: com.android.tools.build:gradle:2.3.1

Działa to dla mnie:

android { 

    ... 

    defaultConfig { 

     ... 

     ndk { 
      abiFilters 'armeabi', 'armeabi-v7a' 
     } 

     externalNativeBuild { 
      ndkBuild { 
       // TODO replace jniDependencies folder with the path to your modules 
       arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/jniDependencies" 
      } 
     } 
    } 

    externalNativeBuild { 
     ndkBuild { 
      path 'src/main/jni/Android.mk' 
     } 
    } 


} 

W ten sposób nie muszę dodawać NDK_MODULE_PATH do mojej PATH w celu zbudowania projektu. Jednak zadanie czyszczenia nie powiedzie się, ponieważ nie spowoduje to odebrania argumentu stąd, więc musiałem dodać inny hack, aby to naprawić:

tasks.withType(com.android.build.gradle.tasks.ExternalNativeCleanTask) { 
    it.actions.clear() 

    doLast { 
     project.delete("${projectDir}/.externalNativeBuild") 
    } 
}