.so файл имеет неожиданный e_machine: 62 (EM_X86_64) - PullRequest
0 голосов
/ 30 марта 2020

я создал общую библиотеку, используя c ++ в vs c. Следующие команды используются для создания общей библиотеки (.so файл)

g++ -Wall -fPIC -I. -c Encrypt.cpp
g++ -shared -o libencrypt.so Encrypt.o
g++ -Wall -I. -c main.cpp
g++ -o test main.o -L. -lencrypt -l:libcryptopp.a
export LD_LIBRARY_PATH=.
./test

Я реализовал libencrypt.so в моем android проекте внутри src/main/jniLibs/<architectures>, которые x86, armeabi-v7a, arm64-v8a

Затем в мои app/build.gradle я включил ff:

ndk {
     abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
}

И, наконец, мою MainActivity. java

class MainActivity : AppCompatActivity() {
    companion object {
        init {
            System.loadLibrary("encrypt")
        }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //tv_cipher.text = encryptString("test")
    }

    external fun encryptString(plaintext: String): String
}

Ошибка выдана: libencrypt.so" has unexpected e_machine: 62 (EM_X86_64)

Примечание. Я использую 64-битную среду Ubuntu 18.04 при создании общей библиотеки. Спасибо!

1 Ответ

0 голосов
/ 30 марта 2020

Ошибка совершенно очевидна: вы скомпилировали libencrypt.so для одной архитектуры (x86_64 или 64-битной Intel) и пытаетесь использовать ее для архитектур ARM (точнее, ARM7 и AArch64).

Вместо этого вы должны кросс-компилировать вашу библиотеку для разных архитектур. Самый простой способ сделать это - положиться на систему сборки CMake , которая поставляется с Android NDK, и просто позволить it кросс-компилировать ваши libencrypt файлы. В качестве альтернативы вы можете выполнить кросс-компиляцию libencrypt для каждой архитектуры отдельно и переместить ее в соответствующий подкаталог jniLibs.

Например, для 64-битной ARM команда кросс-компиляции будет выглядеть так:

aarch64-linux-android21-clang++ -Wall -fPIC -I. -shared Encrypt.cpp -o src/main/jniLibs/arm64-v8a/libencrypt.so
...