android - 我可以在 NDK 应用程序中使用 native 库(安装在 Android 堆栈中)吗?

标签 android c++ c android-ndk

摘自本文

http://marakana.com/forums/android/examples/49.html

我已经看到在 NDK 的帮助下构建的应用程序做了以下事情

1> 它编译所有 C 代码(在 jni 文件夹内)并生成位于 libs 文件夹中的库

2> 在 .apk 包内,该库也位于 lib 文件夹内

在java文件中我可以使用以下代码加载该库

 static {
    System.loadLibrary("ndk_demo");
  }

问题1: 那么现在是否有可能,我可以将其安装在 Android 系统中并从系统加载我的应用程序,而不是将该库保留为 .apk 的一部分?

问题2: 同样,我可以使用 Android 中已安装的其他库,例如 open GLsqLite 吗?

最佳答案

这两个问题的答案都是“是的”,您可以。

第一季度: 如果你想测试一下,可以按照这个方法。

1)使用NDK编译源代码。

2) 将库复制(adb push)到 Android 设备的/system/lib 中。运行应用程序。

当您加载库时,它会从 apk 文件的 lib 文件夹或系统的/system/lib 文件夹进行检查。但要复制到/system/lib 中,您应该重新挂载文件系统。为此,您必须拥有 root 权限。

第二季度:

对问题 1 的回答也回答了这个问题。如果该库存在于/system/lib 中,您也可以调用现有的库。但有一个小问题。由于 jni 接口(interface)遵循命名约定,因此您不能直接调用库内的函数。因此最终“您必须使用现有库创建自己的库”。

步骤如下:

拉取库(adb pull)

编写您的 native 代码,该代码将调用现有库(例如 OpenGL)的例程

通过将代码与预构建的库链接来编译您的代码(请参阅 NDK 文档文件。它非常清楚地写了如何执行此操作。您需要在编译时在 Android.mk 文件中提及它)。

您最终将获得一个内部包含现有库的共享库。

我对现有库之一 libsqlite 做了同样的事情。如果您被困在某个地方,请告诉我。谢谢

关于android - 我可以在 NDK 应用程序中使用 native 库(安装在 Android 堆栈中)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10169336/

相关文章:

android - 如何使用 GraphHopper 在 android osm map 中添加 via(watpoints) 点

android - 为 ListView 中的按钮添加点击监听器

c++ - sscanf_s 无法从字符串中找到所有值

c++ - 语言标准中的 "as if"

c - 将字符串分配为结构成员时出现内存泄漏

c - 字符串文字在内存中的什么位置?栈/堆?

android - 使用 JSend 格式通过 Retrofit 将 JSON 响应转换为 POJO?

java - NDK 应用程序签名检查

c++ - 编译时是否需要短路评估规则?

c - 使用它们的比率对数组进行排序