簡體   English   中英

在jni中返回錯誤的md5哈希

[英]Returning wrong md5 hash in jni

我正在嘗試使用原始/未修改的md5.h和md5c.c(github源文件: https : //github.com/sinhpn92/encryption-in-C/tree/master/app/ src / main / cpp )。 但是我的結果在任何時候都不對。 當我使用三星銀河j設備進行測試時,我的結果是正確的。 但是當我使用三星銀河s7設備進行測試時,我的結果是錯誤的。 我的代碼有什么問題? 有解決這個問題的建議嗎? 感謝您的支持。

這是我的項目: https : //github.com/sinhpn92/encryption-in-C

我使用cmake配置jni lib:

cmake_minimum_required(VERSION 3.4.1)

set(MD5SOURCES
    src/main/cpp/md5.c)


add_library(native-lib
             SHARED
             src/main/cpp/native-lib.cpp
              ${MD5SOURCES})


find_library(log-lib
              log )

target_link_libraries(native-lib
                       ${log-lib} )

這是native-lib:

#include <jni.h>
#include <string>
#include "md5.h"

extern "C"
jstring
Java_test_sinhpn_md5test_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */, jstring data) {
    char *cstr = (char *) (env)->GetStringUTFChars(data, 0);

    MD5_CTX context = {0};
    MD5Init(&context);
    MD5Update(&context, (unsigned char *) cstr, strlen(cstr));
    unsigned char dest[16] = {0};
    MD5Final(dest, &context);
    env->ReleaseStringUTFChars(data, cstr);

    int i;
    char destination[32] = {0};
    for (i = 0; i < 16; i++) {
        sprintf(destination, "%s%02x", destination, dest[i]);
    }
    return env->NewStringUTF(destination);
}

我的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "test.sinhpn.md5test"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.1'
    testCompile 'junit:junit:4.12'
}

這是我測試的結果:

在此處輸入圖片說明

在此處輸入圖片說明

我已經通過替換解決了我的問題:

typedef unsigned long int UINT4; 在md5.c-> typedef uint32_t UINT4;

我在兩個設備上再次進行了測試,並且工作正常。 在64位計算機上,long int(通常)為64位而不是32位

這兩款手機使用不同的ARM指令集。 Galaxy J使用armeabi-v7a,而S7使用arm64-v8a。

上述構建的cmake正在為所有體系結構制作.so文件,這會導致此問題,因為本機代碼中的32位和64位強制轉換轉換問題。

但是,您的情況很簡單。 您可以在以下默認配置中將構建限制為abiFilters“ armeabi-v7a”,“ armeabi”

    externalNativeBuild {
        cmake {
            cppFlags "-frtti -fexceptions"
            abiFilters "armeabi-v7a", "armeabi"
        }
    }

這仍然應該起作用,因為arm64v8a與舊版v7a體系結構向后兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM