【发布时间】:2012-11-25 18:23:20
【问题描述】:
我用原生共享库 (libnativeext.so) 编写了 android 应用程序。
在应用程序的 java 类中,我加载 libnativeext.so System.loadLibrary("nativeext")。 一切都很好。 本机代码编译,libnativeext.so 放在 /libs/armeabi/ 文件夹中。 所以最终的 first.apk 文件包含 /lib/armeabi/libnativeext.so,安装在设备上并且一切正常。
然后我在javaext.jar中导出项目。
此时 javaext.jar 在 /libs/armeabi/ 中包含 libnativeext.so。
在新项目 (second-proj) 中,我包含 javaext.jar 并在 java 构建路径中添加 javaext.jar 的路径。 项目构建时仅对 javaext.jar 中的本机库发出警告。 我在 Eclipse 偏好设置中禁用警告。
但在设备上我得到:java.lang.UnsatisfiedLinkError: Couldn't load nativeext: findLibrary returned null
奇怪,因为 second.apk 里面有 /libs/armeabi/libnativeext.so。我去电话并找出电话上的文件夹 /data/data/myapp/lib/ 是空的!当然 System.loadLibrary 也找不到 libnativeext.so。
我为自己找到了解决方案,但它看起来很丑,我想找到更好的方法。
我在现有的 second-proj/libs/ 文件夹 armeabi 中创建并将 libnativeext.so 放入其中。
第二个项目:
/libs/armeabi/libnativeext.so
/libs/javaext.jar
当我构建项目时,我会查看 second.apk:
/lib/armeabi/libnativeext.so 新的
/libs/armeabi/libnativeext.so
而且这个版本在手机上完美运行。
所以我假设,在安装过程中来自 /libs/armeabi/ 的库被忽略了,只有来自 /lib/armeabi/ 的库被安装在手机上。
所以问题是:如何强制 apk bulder 将 *.so 从 *.jar 复制到正确的 *.apk 文件夹?
【问题讨论】:
-
您不应该在 jar 中分发 .so 文件 - 这就是警告存在的原因,如果您忽略它,后果自负。
-
但是为什么呢?你可以在这里发布证明链接吗? (我在 code.google.com 上阅读了有关此警告的问题,似乎已添加此检查,因为某些开发人员在 *.jar 中分发的不是 android(而是 waindows / linux)*.so 库)。
-
这是否意味着无法将所有必需的代码分发到一个 *.jar 库中?
-
是的,至少没有办法做到与android eclipse插件兼容的事情。请停止尝试与工具链作斗争。
标签: android jar android-ndk shared-libraries