2016-12-14 6 views
0

Ich versuche, Tensorflow in Android arbeiten, irgendwie aus Standard-Projektordner. Ich habe meine build.gradle geändert, aber offensichtlich vermisse ich etwas, da meine App während der Laufzeit abstürzt und die Unerreichbarkeit der nativen Bibliotheken erfüllt. Ich habe einige Stunden damit verbracht, dies zu lösen, aber ohne Erfolg. Könnte jemand bitte helfen?Tensorflow in Android, Gradle Probleme

Grundsätzlich verglichen ich .SO-Datei in APK produziert von TF-Demo und meine .so, und sie sind anders. Also ich nehme an, muss mich irgendwo in meinem Skript ...

def bazel_location = '/usr/local/bin/bazel' 
    def tf_location = '/home/poborak/SW/tensorflow-master' 

    def cpuType = 'armeabi-v7a' 
    def nativeDir = 'src/main/jniLibs/' + cpuType 

project.buildDir = 'gradleBuild' 
getProject().setBuildDir('gradleBuild') 

buildscript { 
    System.properties['com.android.build.gradle.overrideVersionCheck'] = 'true' 

    repositories { 
     jcenter() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.3' 
    } 
} 

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 
    defaultConfig { 
     applicationId "bazinac.aplikacenahouby" 
     minSdkVersion 21 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'src/main/AndroidManifest.xml' 
      java.srcDirs = ['src/main/java', tf_location+'/tensorflow/contrib/android/java'] 
      resources.srcDirs = ['src/main/java'] 
      aidl.srcDirs = ['src/main/java'] 
      renderscript.srcDirs = ['src/main/java'] 
      res.srcDirs = ['src/main/res'] 
      assets.srcDirs = ['src/main/assets'] 
      jniLibs.srcDirs = ['src/main/jniLibs'] 
      jni.srcDirs = [] 
     } 

     debug.setRoot('build-types/debug') 
     release.setRoot('build-types/release') 
    } 

    buildTypes { 

     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 

     debug { 
      debuggable true 
     } 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
    testCompile 'junit:junit:4.12' 
    compile 'org.apache.commons:commons-io:1.3.2' 
} 


task buildNative(type:Exec) { 
    workingDir tf_location 
    commandLine bazel_location, 'build', '-c', 'opt', \ 
     'tensorflow/examples/android:tensorflow_native_libs', \ 
     '--crosstool_top=//external:android/crosstool', \ 
     '--cpu=' + cpuType, \ 
     '[email protected]_tools//tools/cpp:toolchain' 
} 

task copyNativeLibs(type: Copy) { 
    from(tf_location+'bazel-bin/tensorflow/examples/android') { include '**/*.so' } 
    into nativeDir 
     duplicatesStrategy = 'include' 
    } 

    copyNativeLibs.dependsOn buildNative 
    assemble.dependsOn copyNativeLibs 

Antwort

1

Endlich habe ich eine Umgehungslösung gefunden. Es ist Gradle Downgrade auf 2.14.xx und Android Plugin Version 2.1.3. Dann habe ich assembleDebug.dependsOn copyNativeLibs angehängt und es funktioniert jetzt. Trotzdem wäre ich natürlich an einer besseren Lösung interessiert. (AssembleDebug-Eigenschaft wird in neueren APV nicht erkannt.