android - .so 文件有意外的 e_machine : 62 (EM_X86_64)

标签 android shared-libraries

我在 vsc 中使用 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

我在我的android项目中实现了libencrypt.so 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环境。 谢谢!

最佳答案

错误非常清楚:您为单个体系结构(x86_64 或 64 位 Intel)编译了 libencrypt.so,并尝试将其用于 ARM 体系结构(ARM7 和 AArch64,即精确)。

你应该 cross-compile your library对于不同的架构。 最简单的方法是依赖 CMake build system Android NDK 附带,只需让它交叉编译您的 libencrypt 文件即可。 或者,您可以分别为每个架构交叉编译 libencrypt 并将其移动到相应的 jniLibs 子目录中。

例如,对于 64 位 ARM,交叉编译命令为:

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

关于android - .so 文件有意外的 e_machine : 62 (EM_X86_64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60925854/

相关文章:

Android 时代微调项目

c++ - 如何在 QApplication 中应用 QLibraryInfo 中加载的库和插件配置?

c++ - 段错误和对 `dlopen' 的 undefined reference

android - Android Jetpack Compose 中的图标和图像有什么区别?

android - 检测 Android Wear 设备是否连接到手机的最简单方法是什么?

android - 在 admob 中显示某些类型的广告?

应用程序中是否可以存在相同库(具有相同名称)的两个不同版本?

jsf-2 -/WEB-INF/lib 外部共享库 JAR 中的常见 Facelets 文件

c++ - 将共享库与 CMake 链接

java - Sqlite-从两列中选择不同的