2016-08-08 11 views
0

私はBoringSSLを使ってファイルcheckSumを生成するためにアンドロイドでjni関数を作っています。Androidスタジオで事前ビルドされたライブラリを使用する

私はAndroidスタジオでライブラリを使用するために共有ライブラリにboringsslを作成しました。

このようなビルド出力。 enter image description here

私は私のプロジェクトのsrc /メイン/ jniLibs/libに とBoringSSLに* .soのファイルをコピーしたが、私はこのプロジェクトを参照して、私のプロジェクトに適用JNI/srcに/メインに

をフォルダが含まれます。

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

このような私のbuild.gradleファイル。 私はGradleの-実験を使用しています:0.7.0(とWindow10、Androidのメーカー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の私はまだ私の問題を解決しません。

グラデルバージョンを変更しようとしましたが、gradle-experimental:0.7.0以外の自動生成されたjni関数で他のグラデルバージョンがエラーになりました。

誰でも正しい方向に、あるいは解決策を教えてくれますか?

私の質問をお読みいただきありがとうございます。

+0

こんにちは@はい回答 私もあなたのような問題があります。あなたはそれを解決しますか?あなたの簡単なサンプルプロジェクトを私に教えてください。ありがとう。 –

+0

こんにちは@PhanSinh私はちょうど私のソースコードをGithub [link](https://github.com/yein28/Checksum)に入れました。このプロジェクトはMy APKファイルのmd5値を取得しています。私は数ヶ月前にこのコードを書いた。数ヶ月前、それはうまく動作しますが、私はそれがまだ正常に動作しているか分からない。私はこのコードがあなたに役立つことを願っています:) –

+0

THanks so much @心が好きです。 私はOpenSSlを使ってAESを使ってデータを暗号化しています。しかし、今私は、Android 6からOpenSSlの代わりにGoogleがBoringSSLを使用していることを知っていますか? BoringSSLで働いていましたか? –

答えて

2

あなたはJNIからJava APIを呼び出そうとすることができます。良いチュートリアルhereがあります。このsiteにはGoogle APIを呼び出すか、そうしたようにライブラリをリンクすることをおすすめします。

java APIを呼び出せない場合、または呼び出さない場合は、MD5の代わりに常にCRC32を使用できます.CRC32はlibzライブラリを使用し、そのライブラリはすでにNDKファイルにあります。 C.

#include <zlib.h> 

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

でCRC32は、あなたが、これはBoringSSLのための私のgradle.buildファイルでMD5とBoringSSLを必要とする場合には

を提出あなたのGradleにldLibs.addAll(['z'])を追加することを忘れないでください。

注:私はubuntu、libssl.a libcrypto.aおよびlibdecrepitでコンパイルした3つのライブラリを使用しています。

注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を使用していないが、私はboringSSLを使用してSHA256を使用しているし、それが正常に動作します。チェックサムメソッドとしても使用できます。これは私の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; 
} 
関連する問題