3

BoringSSLを使用してファイルcheckSumを生成するために、Androidでjni関数を作成しています。

そこで、Android studio で Prebuilt Library を使用するために、共有ライブラリに Boringssl をビルドしました。

ビルド出力はこのようになります。 ここに画像の説明を入力

*.so ファイルをプロジェクトの src/main/jniLibs/lib にコピーし、BoringSSL インクルード フォルダーを src/main/jni にコピーしました。

このプロジェクトを参考にして、自分のプロジェクトに応募しました。

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

このような私のbuild.gradleファイル。私はgradle-experimental: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'
}

これが私のプロジェクト構造です。

ここに画像の説明を入力

gradle sync エラーが発生していないので、サンプルプロジェクトを適切に適用したと思います。

そして、MD5関数を使用すると、Android Studioのオートコンプリート関数名は次のようになります。 ここに画像の説明を入力

しかし、実行をクリックすると、このようなエラーが発生しました... ここに画像の説明を入力

Google、github、そしてもちろんstackoverflowの以前の回答で多くのプロジェクトを検索しましたが、それでも問題は解決しません。

gradle バージョンを変更してみましたが、他の gradle バージョンでは gradle-experimental:0.7.0 以外の自動生成された jni 関数でエラーが発生しました。

誰かが私を正しい方向や解決策に向けることができますか?

私の質問を読んでくれてありがとう。

4

1 に答える 1

3

JNI から Java API を呼び出そうとすることができます。すばらしいチュートリアルがここにあります。Google は、このサイトで Java API を呼び出すことを推奨しています。または、ライブラリをリンクすることもできます。

Java API を呼び出せない場合、または呼び出したくない場合は、MD5 の代わりにいつでも CRC32 を使用できます。CRC32 は libz ライブラリを使用し、そのライブラリはすでに NDK ファイルにあります。C の 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 が必要な場合、これは BoringSSL 用の私の gradle.build ファイルです。

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

注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 は使用していませんが、退屈な SSL を使用して 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;
}
于 2016-08-23T17:39:58.013 に答える