Android NDK шифрует скомпилированные файлы c ++? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть файл C ++ в моем проекте Android (native-lib.cpp):

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

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_keysnative_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string api_key = "0123456789abcdef";
    return env->NewStringUTF(api_key.c_str());
}

Когда я собираю проект и распаковываю apk, этот файл будет скомпилирован в двоичный файл: lib/x86/libnative-lib.so.

Если затем я пытаюсь импортировать и использовать этот файл в другом проекте, я получаю ошибку:

public class Main {

    static {
        try {
            System.load("/Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so");
        } catch (UnsatisfiedLinkError e) {
            System.err.println(e);
            System.exit(1);
        }
    }
}

java .lang.UnsatisfiedLinkError: / Users / u / Playground / KeysNative / app-debug / lib / x86 / libnative-lib.so: dlopen (/Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so, 1): подходящее изображение не найдено , Обнаружил: /Users/u/Playground/KeysNative/app-debug/lib/x86/libnative-lib.so: неизвестный тип файла, первые восемь байтов: 0x7F 0x45 0x4 C 0x46 0x01 0x01 0x01 0x00 / Users / u / Playground / KeysNative / app-debug / lib / x86 / libnative-lib.so: неизвестный тип файла, первые восемь байтов: 0x7F 0x45 0x4 C 0x46 0x01 0x01 0x01 0x00

Вопрос : Используют ли эти файлы хранилище ключей java в компилируемом проекте или какую-либо другую подпись?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Как сказал @Michael, поскольку .so был сгенерирован из Android NDK, он содержит Android зависимостей и может быть запущен только в системе Android.

0 голосов
/ 10 февраля 2020

Вы не можете загрузить нативную сборку из файловой системы вашего компьютера на мобильное устройство.

Этого уже должно хватить для связывания сборки:

static {
    try {
        System.loadLibrary("libnative-lib");
    } catch (UnsatisfiedLinkError e) {
        Log.e(LOG_TAG, "" + e.getMessage());
    }
}

Однако, если у вас есть только x86 сборка, это будет работать только на эмуляторе x86 Android.

...