2016-08-08 1 views
0

Я создаю функцию jni в android для создания файла checkSum с помощью BoringSSL.Использование Prebuilt библиотеки в Android Studio

Итак, я построил boringssl для совместной работы библиотеки для использования. Предварительная библиотека в студии Android.

Вывод сборки следующим образом. enter image description here

Я скопировал * .so файл в моем проекте SRC/главная/jniLibs/Библиотека и BoringSSL включают в себя папку в SRC/главная/JNI

Я ссылается этот проект и применить к моим проектам.

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

Мой build.gradle файл, как это. Я использую Gradle-экспериментальное: 0.7.0 (и 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' 
} 

Это моя структура проекта.

enter image description here

Я думаю, что я правильно применить примеры проектов, потому что это не произошло Gradle ошибка синхронизации.

И когда я использую функцию MD5 для Android, полностью завершите имя функции, как это. enter image description here

Но я нажимаю запустить его произошла ошибка, как это ... enter image description here

Я искал много проект в гугле, GitHub, и, конечно, StackOverflow предыдущие ответы, но я до сих пор не решить мою проблему.

Я пробовал изменить версию градиента, но другая ошибка в градиенте произошла ошибка в автоматической сгенерированной функции jni, кроме gradle-experimental: 0.7.0.

Может ли кто-нибудь указать мне в правильном направлении или даже на решение?

Спасибо, что прочитали мой вопрос.

+0

Hi @ 심 예인 У меня проблема, как и вы. Вы разрешаете это? Не могли бы вы поделиться со мной своим простым примером? Благодарю. –

+0

Привет @PhanSinh Я просто поместил свой исходный код в Github [link] (https://github.com/yein28/Checksum). Этот проект получает значение md5 файла My APK. Я написал этот код несколько месяцев назад. Несколько месяцев назад он отлично работает, но я не уверен, что он все еще работает нормально. Я надеюсь, что этот код будет полезен для вас :) –

+0

Чрезвычайно важно @ 심 예인. Я использую OpenSSl для AES для шифрования моих данных. Но теперь я обнаружил, что Google использует BoringSSL вместо OpenSSl с Android 6. Знаете ли вы? Вы работали с BoringSSL? –

ответ

2

Вы можете попробовать вызвать java API из JNI, есть хороший учебник here, Google рекомендует на этом site вы должны вызывать java API или вы можете связывать библиотеки так же, как и вы.

Если вы не можете или не хотите вызывать java API, вы всегда можете использовать CRC32 вместо MD5, CRC32 использует библиотеку libz, и эта библиотека уже находится в файлах NDK. CRC32 в С.

#include <zlib.h> 

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

Не забудьте добавить ldLibs.addAll(['z']) к вашему Gradle файл

В случае, если необходимо MD5 и BoringSSL это мой gradle.build файл для BoringSSL.

Примечание: Я использую 3 библиотеки, которые вы компилируете на ubuntu, libssl.a libcrypto.a и libdecrepit.

Примечание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" 
        } 
       } 
      } 
     } 
    }  
}  

Я не использовал MD5, но я использовал SHA256, используя boringSSL и она отлично работает. Вы можете использовать его также как метод контрольной суммы. Это мой метод для 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^