【问题标题】:Can Android NDK include a windows dll to a an Android shared library?Android NDK 可以将 Windows dll 包含到 Android 共享库中吗?
【发布时间】:2013-10-08 19:34:59
【问题描述】:

是否甚至可以在 ndk-build 命令中链接/包含一个 dll 文件并生成一个可以从 android java 代码访问 dll 函数的共享库。

我一直在尝试,我尝试使用 SWIG 为 dll 创建一个 java 包装器代码,但我没有成功,然后我开始认为它是否可能!

谢谢。

【问题讨论】:

  • 您不能在 Android 上运行任意 Windows 代码。

标签: java android c dll android-ndk


【解决方案1】:

没有。 Windows DLL 的格式与 Android 和 Linux 不同。

Windows 使用一种称为 PE COFF 的格式:“可移植的可执行文件,通用对象文件格式”。虽然 COFF 本身来自 UNIX,但微软也有自己的版本。为了支持 .Net 对象,存在进一步的不兼容性。大多数 UNIX 和 Linux 使用 ELF - 执行和链接格式。

即使他们奇迹般地使用相同的格式,它也可能仍然无法工作,因为机器架构必须相同,例如ARM(并且有多种 ARM 配置)或 Intel x86。

还有更多。即使您设法让 DLL 运行,它还能使用什么? DLL 通常具有其他外部依赖项,例如 C 运行时库、MSVCRT 或 kernel.dll

那么,获取源代码并在本地重新编译它?这可能有效,但 Windows DLL 有时有一个可选的 DLLMain() 入口点,Linux .so 文件没有直接等效项。剩下的代码呢?它是以可移植方式编写的吗?它是否始终坚持使用 ISO 语言标准?要真正实现可移植性,必须以这种方式设计和编写代码。

【讨论】:

  • 问题是共享库应该是独立的,请看这里ngspice.sourceforge.net/shared.htmlunix共享库也有,可以用吗?
  • @simo 想了想又问了一个问题here,结果发现整个库需要专门为Android构建。
  • 我正在使用 android sdk,是否有任何方法或解决方法来管理在我的原生 android 应用程序中导入 dll 库?我的问题在这里描述,如果你有解决方案stackoverflow.com/questions/28393305/…
【解决方案2】:

没有。并非没有构建一个完整的 Windows 兼容层。 Android 与 Windows 开箱即用不兼容。

此外,Windows DLL 往往针对 Intel x86 CPU 进行编译,而大多数 Android 设备都有 ARM CPU。虽然存在用于 ARM 的 Windows(Windows Phone、Windows RT 等),但 DLL 应该存在的环境在 Android 上并不存在。

【讨论】:

  • 我正在使用 android sdk,是否有任何方法或解决方法来管理在我的原生 android 应用程序中导入 dll 库?我的问题在这里描述,如果你有解决方案stackoverflow.com/questions/28393305/…
  • 看到你的问题。你不能。考虑将 C# 重写为 Java 并将 .NET 库调用替换为等效的 Java 库调用。根据您使用多少特定于 Windows 的 API,它可能可行,也可能不可行。
猜你喜欢
  • 2018-02-20
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2017-09-19
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多