利用dlopen直接调用so函数

/ 1评 / 0

分析一算法,感觉太坑爹,一直没搞出来,索性直接调用so,

#include <jni.h>
#include <string>
#include <dlfcn.h>
#include <android/log.h>
#include "native-lib.h"

typedef char *(*getMd5Code)(char *code, int size); //声明函数原型

typedef char *(*getBase64)(char *code, char *result, int size);

#define LOGE(format, ...)   __android_log_print(ANDROID_LOG_ERROR, "qtfreet00", format, ##__VA_ARGS__);
#define LOGI(format, ...)   __android_log_print(ANDROID_LOG_INFO, "qtfreet00", format, ##__VA_ARGS__);
extern "C" {

void test() {
    getMd5Code getCode;
    getBase64 getbase64;
    void *handle;
    char *result;
    char baseResult[28] = {0};
    char ret[16] = {0};
    char *str = new char[63];
    memcpy(str, "2016-10-21xxxxxxxxxxxxxxxxxxxxxxxxxxxAND_a01_04.01.8241.010000014", 63);
    handle = dlopen("/data/data/com.qtfreet.myapplication/lib/libtrip.so", RTLD_LAZY);   //拿到so地址
    if (!handle) {
        LOGE("dlopen so error");
        return;
    }
    getCode = (getMd5Code) dlsym(handle, "md5Format");  //拿到函数符号,引号里为导出函数
    if (!getCode) {
        LOGE("dlsym md5 error");
        return;
    }
    result = getCode(str, strlen(str));
    LOGI("the md5 code is %s", result);
    LOGE("the md5 code 16 is %02x", result);
    free(str);
    getbase64 = (getBase64) dlsym(handle, "base64_encode");
    if (!getbase64) {
        LOGE("dlsym base64 error");
        return;
    }
    getbase64(result, baseResult, 16);
    LOGI("the base64 code is %s", baseResult);
    int i = 0;
    do {
        ret[i] = baseResult[2 * i];
        ++i;
    }
    while (i != 11);
    ret[11] = 0;
    LOGI("the result  code is %s", ret);
}

jstring
Java_com_qtfreet_myapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    LOGE("come in");
    test();
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
  }
}

一条回应:“利用dlopen直接调用so函数”

发表评论

电子邮件地址不会被公开。 必填项已用*标注