【问题标题】:Using Prebuilt library in Android Studio在 Android Studio 中使用 Prebuilt 库
【发布时间】:2016-08-08 15:12:08
【问题描述】:

我正在 android 中创建一个 jni 函数来使用 BoringSSL 生成文件 checkSum。

所以我将boringssl构建到共享库中,以便在Android studio中使用Prebuilt Library。

这样的构建输出。

我将 *.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 版本在自动生​​成的 jni 函数中出现错误,除了 gradle-experimental:0.7.0。

谁能指出我正确的方向甚至解决方案?

感谢您阅读我的问题。

【问题讨论】:

  • 嗨@심예인 我也有和你一样的问题。你解决了吗?你能为我分享你的简单示例项目吗?谢谢。
  • 嗨 @PhanSinh 我刚刚把我的源代码放在 Github link 这个项目是获取我的 APK 文件的 md5 值。几个月前我写了这段代码。几个月前,它工作正常,但我不确定它是否仍然工作正常。我希望这段代码对你有帮助:)
  • 非常感谢@심예인。我正在使用 OpenSSl for AES 来加密我的数据。但现在我发现 Google 使用 BoringSSL 代替 Android 6 中的 OpenSSl。你知道吗?你使用过 BoringSSL 吗?
  • @PhanSinh 是的,我构建了 BoringSSL 库并应用了我的项目。我在评论中留下了我的 github 存储库,这是我使用 BoringSSL 工作的示例!
  • 如何构建包含 openssl 库?我参考了本指南wiki.openssl.org/index.php/Android,但它不起作用。你有脸书或Skype吗?我可以问你更多吗?

标签: android gradle android-ndk java-native-interface boringssl


【解决方案1】:

您可以尝试从 JNI 调用 java API,有一个很好的教程 here,Google 建议您在此 site 上调用 java API,或者您可以像以前一样链接库。

如果您不能或不想调用 java API,您始终可以使用 CRC32 而不是 MD5,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,但我使用了 SHA256,使用了无聊的 SSL,它工作正常。您也可以将其用作校验和方法。这是我的 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多