【问题标题】:Manually (aapt) add native library .so to apk手动(aapt)将本机库 .so 添加到 apk
【发布时间】:2014-05-07 15:33:24
【问题描述】:

出于多种原因,我手动构建我的项目(或多或少遵循这些步骤http://geosoft.no/development/android.html),而不使用 ant。

我的项目使用 NDK 并构建了一个 .so 库。

  • 使用 Eclipse:

当我使用 Eclipse 构建我的项目时,一切正常:我将 libMyNativeLib.so 拖放到 libs/armeabi 目录中,当我调用 loadLibrary(MyNativeLib) 时它工作正常:我可以从我的 Java 代码中调用本机方法。

  • 手动:

现在我想手动构建我的.apk。除了本地库加载外,一切正常。 使用aapt add,我在我的apk 中添加了:lib/armeabi/libMyNativeLib.so(我看到Eclipse 生成的apk 在lib/armeabi 中包含这个.so,所以我在apk 中使用了相同的路径)。 调用loadLibrary(MyNativeLib)时出现如下异常

java.lang.UnsatisfiedLinkError: Couldn't load MyNativeLib from loader dalvik.system.PathClassLoader[DexPathList...

为什么会这样?

我应该在dx --dex 步骤中针对本机代码 (.so lib) 做点什么吗?我不这么认为,但我可能错了? (我只使用dx --dex 和我的.jar 库,我猜这是逻辑)。

你有什么想法吗?

谢谢

【问题讨论】:

  • 我不确定您为什么选择避开 Ant。 Gradle,带有 Gradle for Android 插件,可能不会遇到您在 Ant 中遇到的问题,并且会是比手动组装 APK 恕我直言更可靠的解决方案。
  • 删除 apk 并重新安装,同时在另一个终端中查看未过滤的 logcat 是否有任何相关投诉。使用 run-as 或隐式 root 模拟器查看安装并查看文件是否存在并已解压缩,以及(使用 ls -l)是否设置了可执行位。使用本机库解压缩有效的 apk 并与非工作的 apk 进行比较。 .so 文件正在与其他所有文件一起签名,对吗?

标签: android android-ndk aapt


【解决方案1】:

感谢 apktool (http://ibotpeaches.github.io/Apktool/) 我发现了问题所在。

生成最终 .apk 包的 makefile 有错误。实际上aapt add 命令在路径中包含\ 而不是/。当我在 Windows 上生成时,我的所有路径都使用 \ 作为分隔符。这就是为什么我用\ 代替aapt add。但是,由于在 Android (Unix) 上安装 .apk 时使用了此路径,所以我应该使用 / 分隔符。

【讨论】:

  • 请发布您使用的实际 aapt 调用。我知道您的问题已解决,但对遇到此答案的其他人会有所帮助。它也不包含在原始问题帖子中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多