首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android中使用预置库

在Android中使用预置库
EN

Stack Overflow用户
提问于 2016-08-08 15:12:08
回答 1查看 2.8K关注 0票数 3

我在android中创建了一个jni函数,使用BoringSSL生成文件BoringSSL。

因此,我在Android工作室中构建了用于共享库的boringssl,以便使用预建库。

像这样的构建输出。

我将*.so文件复制到我的项目src/main/jniLibs/lib和BoringSSL包含文件夹到src/main/jni

我参考了这个项目,并将其应用于我的项目。

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

我的build.gradle文件是这样的。我正在使用gradle-实验性:0.7.0(和Window10,AndroidStudio2.1.2)

代码语言:javascript
运行
复制
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同步错误。

当我使用MD5函数时,Android自动完成函数名如下。

但我点击run就会出现这样的错误.

我在google、github上搜索了很多项目,当然,以前的答案也是堆叠溢出式的,但我仍然没有解决我的问题。

我尝试过更改gradle版本,但是其他gradle版本在自动生成的jni函数中出现了错误,除了gradle-实验:0.7.0。

谁能给我指明正确的方向,甚至是解决方案?

谢谢你读我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-23 17:39:58

您可以尝试从JNI调用java,有一个很好的教程这里,谷歌建议在这个站点上调用java,或者您可以像以前一样链接库。

如果您不能或不想调用java,您可以始终使用CRC32而不是MD5,CRC32使用libz库,并且该库已经在NDK文件中。CRC32在C.

代码语言:javascript
运行
复制
#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'])添加到分级文件中

如果您需要MD5和BoringSSL,这是BoringSSL的gradle.build文件。

注意:我使用的是您在ubuntu、libssl.a libcryp.a和libabport.a上编译的3个库。

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

代码语言:javascript
运行
复制
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方法。

代码语言:javascript
运行
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38832797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档