2016-08-08 77 views
0

Ich mache eine Jni-Funktion in Android, um Datei CheckSum mit BoringSSL zu generieren.Verwenden von vorgefertigten Bibliothek in Android Studio

Also ich baute loringssl zu geteilten Bibliothek für die Verwendung Prebuilt Library in Android Studio.

Die Build-Ausgabe wie folgt. enter image description here

Ich kopierte die * .so-Datei in meinem Projekt src/main/jniLibs/lib und BoringSSL umfassen Ordner src/main/jni

ich dieses Projekt verwiesen und auf meine Projekte anwenden.

https://github.com/googlesamples/android-ndk/tree/master/hello-libs

Meine build.gradle Datei wie folgt. Ich verwende gradle-experimental: 0.7.0 (und Window10, Android Studio 2.1.2)

apply plugin: 'com.android.model.application' 

model { 
    repositories { 
     libs(PrebuiltLibraries) { 
      boringssl { 
       headers.srcDir "src/main/jni/include/openssl" 

       binaries.withType(SharedLibraryBinary) { 
        sharedLibraryFile = file("src/main/jniLibs/lib/libcrypto.so") 
        sharedLibraryFile = file("src/main/jniLibs/lib/libssl.so") 
       } 
      } 
     } 
    } 
    android { 
     compileSdkVersion = 24 
     buildToolsVersion = '24.0.1' 

     defaultConfig { 
      applicationId = 'yein.a' 
      minSdkVersion.apiLevel = 19 
      targetSdkVersion.apiLevel = 24 
      versionCode = 1 
      versionName = '1.0' 
     } 
     ndk { 
      moduleName = 'hello-libs' 
      ldLibs.addAll(['android', 'log']) 
     } 
     sources { 
      main { 
       jni { 
        dependencies { 
         library 'boringssl' linkage 'shared' 
        } 
       } 
       jniLibs{ 
        source{ 
         srcDir "src/main/jniLibs/lib" 
        } 
       } 
      } 
     } 
     productFlavors{ 
      create("arm"){ 
       ndk.abiFilters.add("armeabi-v7a") 
      } 
     } 
     buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles.add(file('proguard-android.txt')) 
      } 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:24.1.1' 
} 

Das ist meine Projektstruktur.

enter image description here

Ich glaube, ich richtig die Beispielprojekte anwenden, weil es nicht gradle Synchronisierungsfehler aufgetreten ist.

Und wenn ich MD5-Funktion Android Studio verwenden, vervollständigen Funktionsname wie folgt. enter image description here

Aber ich auf Ausführen es so aufgetretenen Fehler ... enter image description here

Ich suchte viel Projekt in Google, Github und natürlich bisherige Antworten Stackoverflow, aber ich immer noch nicht mein Problem lösen.

Ich versuchte Änderung Gradle Version, aber andere Gradle-Version aufgetreten Fehler in auto generierte jni Funktion außer Gradle-experimental: 0.7.0.

Konnte mir jemand in die richtige Richtung oder sogar eine Lösung zeigen?

Vielen Dank für meine Frage zu lesen.

+0

Hallo @ 심 예인 Ich habe ein Problem wie Sie auch. Löst du es auf? Können Sie mir Ihr einfaches Beispielprojekt mitteilen? Vielen Dank. –

+0

Hallo @ PhanSinh Ich habe nur meinen Quellcode auf Github [Link] (https://github.com/yein28/Checksum) Dieses Projekt wird MD5-Wert meiner APK-Datei erhalten. Ich habe diesen Code vor einigen Monaten geschrieben. vor ein paar Monaten, es funktioniert gut, aber ich bin mir nicht sicher, es funktioniert immer noch gut. Ich hoffe, dieser Code ist hilfreich für Sie :) –

+0

Vielen Dank @ 심 예인. Ich verwende OpenSSL für AES, um meine Daten zu verschlüsseln. Aber jetzt habe ich festgestellt, dass Google BoringSSL anstelle von OpenSSl von Android 6 verwendet. Wissen Sie? Hast du mit BoringSSL gearbeitet? –

Antwort

2

Sie können versuchen, die Java-API von JNI aufrufen, gibt es ein nettes Tutorial here, empfiehlt Google site Sie sollten die Java-API aufrufen oder Sie können die Bibliotheken wie Sie verknüpfen.

Wenn Sie die Java-API nicht aufrufen können oder wollen, können Sie immer CRC32 anstelle von MD5 verwenden, CRC32 verwendet die libz-Bibliothek und diese Bibliothek ist bereits in den NDK-Dateien enthalten. CRC32 in C.

#include <zlib.h> 

int checkSumCRC32(char *text){ 
    long n = crc32(0, (const void*)text, strlen(text)); 
    printf("CRC32 %d", n); 
    return n; 
} 

Denken Sie daran, ldLibs.addAll(['z']) auf Ihre Gradle

Datei

Bei hinzufügen müssen Sie MD5 und BoringSSL dies ist mein gradle.build Datei für BoringSSL.

Hinweis: Ich verwende die 3 Bibliotheken, die Sie auf ubuntu, libssl.a libcrypto.a und libdecrepit kompilieren.ein

Hinweis 2: I am using com.android.tools.build:gradle-experimental:0.7.0-alpha4

apply plugin: 'com.android.model.application' 

model { 
    repositories { 
     libs(PrebuiltLibraries) { 
      libcrypto { 
       headers.srcDir "./main/jni/include/openssl" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/crypto/libcrypto.a") 
       } 
      } 
      libssl { 
       headers.srcDir "./main/jni/include/openssl" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/ssl/libssl.a") 
       } 
      } 
      libdecrepit { 
       headers.srcDir "src/main/jni/include/openssl" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/decrepit/libdecrepit.a") 
       } 
      } 
     } 
    } 
    android { 
     compileSdkVersion = 23 
     buildToolsVersion = "22.0.1" 

     defaultConfig { 
      applicationId = "net.app" 
      minSdkVersion.apiLevel = 9 
      targetSdkVersion.apiLevel = 23 
      versionCode = 1 
     } 
     ndk { 
      platformVersion = 21 
      moduleName = "modulename" 
      toolchain = "clang" 
      abiFilters.addAll([ 'armeabi-v7a']) 
      CFlags.addAll(["-fvisibility=hidden", "-fpic"]) 
      ldLibs.addAll(['log', 'z', 'android']) //Libreria llog, lz y landroid 

     } 

     sources { 
      main { 
       jni{ 
        dependencies { 
         library "libcrypto" linkage "static" 
         library "libssl" linkage "static" 
         library "libdecrepit" linkage "static" 
        } 
       } 
      } 
     } 
    }  
}  

Ich habe verwendet MD5 nicht, aber ich habe SHA256 mit boringSSL verwendet und es funktioniert gut. Sie können es auch als Prüfsummenmethode verwenden. Dies ist meine Methode für SHA256.

char *sha256(char *str){ 
    unsigned char hash[SHA256_DIGEST_LENGTH]; 
    char *output = (char *) malloc(sizeof(char)*((SHA256_DIGEST_LENGTH*2)+1)); 
    if (output == NULL) { 
     return NULL; 
    } 

    SHA256_CTX sha256; 
    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, str, strlen(str)); 
    SHA256_Final(hash, &sha256); 
    int i; 
    for(i = 0; i < SHA256_DIGEST_LENGTH; i++){ 

     sprintf(&output[i*2], "%02x", (unsigned int)hash[i]); 
    } 
    return output; 
}