在 Python 中从 Apk 使用和导入 .SO 本机库

Use And Import .SO Native Library From Apk In Python

如何导入和使用从 apk 文件中提取的 .SO 文件? 我在 Linux 中使用了 ctypes 库,但它在我尝试的每一种方式上都给了我错误。

.so 文件有 2 个版本:arm64 和 armeabi。 当我尝试导入 32 位的 armeabi 版本时,它给了我

wrong ELF class: ELFCLASS32

所以我尝试了 arm64,不知何故我得到了

cannot open shared object file: No such file or directory

我可以向你保证这不是拼写错误的路径,我尝试使用相同的路径复制它。但是我无法导入它,因为没有这样的文件。

代码:

import ctypes

def main():

     TestLib = ctypes.CDLL('/home/manalkaff/Desktop/arm64-v8a/nativelibrary.so')

if __name__ == '__main__':

     main()

这是我应该做的吗?还是有别的办法?

您无法在 x86 上加载和执行 ARM 代码 CPU。为此,您需要一个模拟 ARM CPU 的虚拟机。

即使在 Linux ARM 上加载 .so 文件后,您可能仍然缺少一些 Android 依赖项。使用 ldd copied.so 查看哪个。

您可以尝试反编译您的共享对象并将其移植到 x86。为此,您应该在 Ghidra 中加载您的二进制文件并提取除 JNI 初始化等实用函数之外的所有函数,如果需要,这些函数将由编译器自动插入。然后使用您选择的编译器和 IDE 重建,例如 Clion + Clang。如果使用 Android API,请不要忘记修复一些错误并切换到 Windows API。不过,这将需要一些时间和精力,具体取决于函数的数量和二进制文件的大小(再次支持的内容除外)。