当前位置: 首页 > 面试题库 >

是否可以在Android应用程序中包含/链接并使用为Linux构建的共享库(.so)文件?

梁英喆
2023-03-14
问题内容

我正在一个项目中,我需要在Android应用程序中包括NGSpice仿真库,并且当然可以使用它。

我尝试使用SWIG和Android NDK将NGSpice Windows
DLL包含在我的android应用程序中,但事实证明这甚至是不可能的,因此现在我开始考虑将NGSpice构建为linux的共享库。

现在,我的问题是,我可以像在Android应用程序中那样使用Linux共享库用于NGSpice,还是需要以不同的方式构建才能在我的Android应用程序上工作。

谢谢。


问题答案:

不会。Android通常与传统linux有两个主要区别:

1)它使用Bionic C库和动态链接器,而不是更传统的集(例如glibc)。

2)Android通常在ARM或32位x86处理器(或在极少数情况下为MIPS)上运行,而您的台式机Linux库可能是64位或32位x86代码。

如果您构建的.so与机器的体系结构以及仿生的系统库功能和动态链接器兼容,那么它应该是可行的。

或者,如果您有兼容的体系结构但错误的libc,则可以编写自己的加载程序以安全形式在受保护的设备上或在有根设备上将其加载到内存中,从而可以运行更传统的加载程序chroot中的linux用户空间(通常是Debian派生的)。但是,这两种方法都不容易集成到Android应用程序中-
对于后者,您几乎肯定必须通过进程间通信来传递工作,并且在前一种情况下也可能会更容易。

唯一真正认可的解决方案是使用ndk构建系统或ndk生成的“独立工具链”以及库的当前构建系统从源代码重建库。



 类似资料:
  • 问题内容: 我可以使用带有静态链接的gcc构建可执行文件: gcc-静态xxx.c -o xxx 所以我可以在没有任何外部依赖库的情况下运行xxx。 但是,如果我要构建没有外部依赖库的共享库怎么办?我的意思是我希望共享库静态链接其外部引用。 问题答案: 这将起作用: 需要说明的是:-static标志(如果提供给gcc)会传递给链接器(ld),并告诉它与库的静态版本(.a)(由-l标志指定)一起使用

  • 问题内容: 我希望当用户共享另一个应用程序(例如浏览器)的URL时,我的Android应用程序显示为一个选项。我该如何注册我的应用程序?我如何反应链接共享? 非常感谢。 编辑: 我试过像这样使用IntentFilter,但没有成功: 有任何想法吗? 问题答案: 您至少需要: 在清单中…至少会使其显示在“共享”列表中。 您缺少的最重要的部分是: 要使其实际执行某项操作,您需要一个Activity。

  • 正如您所知道的,在Jenkins的共享库中,可以在Jenkinsfile中调用vars文件夹中文件的内容。 例如,在共享库的vars文件夹中,我们可以有一个名为在Jenkins文件中,我们可以通过以下方式调用它: 如本节所述。使用groovy文件并使用Jenkins文件中的方法调用它们,我没有任何问题。 但是我想定制一个管道,并使其尽可能通用。所以我想调用包含在文件夹中但在同一管道中的groovy

  • 问题内容: 假设我在Linux中有一个使用共享库(文件)的应用程序。我的问题是这些库中的代码是否将在与主应用程序相同的堆中分配内存,还是使用自己的堆? 因此,例如,文件中的某些函数调用,它将使用与应用程序相同的堆管理器,还是使用另一个应用程序?同样,那些共享内存中的全局数据又如何呢?它在哪里?对于应用程序,我知道它位于bss和数据段中,但是不知道这些共享对象文件在哪里。 问题答案: 我的问题是这些

  • 我根据以下站点遵循了该过程:https://developer.vuforia.com/resources/dev-guide/step-3-compiling-running-vuforia-sample-app。 我试图通过cygwin构建ImageTargets共享库,但显示的消息是: 和

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?