【发布时间】:2012-07-02 14:53:34
【问题描述】:
我成功编译并打包了 Android NDK 中的 NativeActivity 示例。它在 Android 模拟器甚至 TI OMAP3621 设备(Nook Color)上运行良好。但是,它在 Tegra 2 设备上崩溃。我还注意到 APK 中包含的 .so 被复制到 Nook 上的 /dev/dev/com.example.native_activity/lib/libnative-activity.so 中,但在 Tegra 2 手机上没有。确实创建了 /data/data/com.example.native_activity/lib 目录,但是缺少应该在其中的 .so !我什至尝试手动将 .so 复制到那里,但是当我尝试启动它时应用程序仍然崩溃。
为什么安装程序允许安装 APK,但拒绝复制 .so?
模拟器运行的是 Android 2.3.3 Nook Color 运行的是 Android 4.0.4 Tegra 2 手机运行的是 Android 2.3.7
更新:
如果我手动将 .so 复制到 /data,应用程序 确实 会运行。所以现在问题似乎是由于 aapt 的包装,因为当手机安装应用程序时,它不会复制 .so。我从命令行使用 aapt(不是通过 Eclipse),所以在包含共享库时我可能没有使用正确的选项。谁能解释一下 aapt 如何打包一个包含本机共享库的 APK?
另一个更新:
嗯,这很奇怪。我刚刚发现,如果我安装了 APK,然后立即在已安装的应用程序上获取应用程序信息并“移动到 SD 卡”,它就可以了! .so 按预期复制到 /data/data/com.example/native-activity。如果我随后选择“移至手机”,它也可以工作!
我在 Tegra 2 设备上运行 Cyanogenmod 7。为什么在移动/安装到 SD 卡而不是手机时这会起作用?
【问题讨论】:
-
APK 文件为 ZIP 格式。你能检查一下这个文件的树结构吗?在我的例子中,“unzip -l mine.apk”给出“lib/armeabi/libmine.apk”和“lib/armeabi-v7a/libmine.apk”——一个是为 APP_ABI=armeabi 而编译的,另一个是为 APP_ABI=armeabi -v7a。 Tegra2 设备应该从 lib/armeabi-v7a 加载库。
-
您的意思是“libmine.so”而不是“libmine.apk”吗?我的 APK 包含一个 lib 目录,其中包含 .so 中的本机代码:lib/armeabi/libnative-activity.so。同样,它适用于某些设备,但不是所有设备。
-
您应该完全卸载它并正常重新安装,看看会发生什么。如果人们谈论的 4.x 的 ABI 混淆问题是错误的,那么您可能已经找到了一种解决方法的怪癖,但可能不是您想让用户依赖的方法。
-
当然,.so 应该是。如果您的 Tegra2 手机上的 lib 加载程序有问题,我并不感到惊讶。请检查设备上@987654321@ 命令的输出(在命令行上使用
adb shell getprop ro.product.cpu.abi2)。 -
LG P999 / T-Mobile G2x:ro.product.cpu.abi=armeabi-v7a ro.product.cpu.abi2=armeabi
标签: android android-ndk