环境……
我有一个全新的 Visual Studio 2015 Android NDK 解决方案。 这包含 2 个项目(由 visual studio 生成的默认模板代码):
- 原生 Activity 。这是我想放置 Android 特定代码的地方。它有一些默认代码,可以在绿色和黑色之间淡化屏幕颜色。
- 帮助部署的“打包”项目。
我已将其成功部署到英特尔 HAXM 虚拟设备以及通过 USB 连接的真实设备。到目前为止一切都很好。
然后我添加了一个 Android 动态库项目 (.so) - 这是我要放置核心代码的地方(与平台无关)。 我从 native Activity 项目中添加了对此核心库的引用。
一切都可以正常编译和链接。我仍然可以创建 .APK 文件。
其他信息:
- Android SDK 5.1 (Android-22)
- 安卓 NDK 21
- x86
- clang 3.8
- C++ 11
- 不使用 Make 文件或 Gradle
问题...
现在每当我部署到虚拟/真实设备时,我都会收到以下错误(取自 logcat)
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.NATester/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.NATester-2/lib/x86/libNATester.so
我尝试过的事情......
- 将核心库更改为静态 (.a)
- 检查 android 设备以查看文件是否存在 - 它确实存在。
- 手动将 .APK 部署到 android 设备。
有些文章建议使用 Java 代码加载库 - 我想避免调用 Java 代码,例如System.LoadLibrary 因为这看起来像是一个 hack - 我觉得应该可以在 android 上拥有一个纯 C++ 应用程序。我不能是唯一遇到这个问题的人吗?!
这看起来很相关但是很旧,而且对于一定很常见的情况来说又是一个不必要的 hack - Can't load native shared library with dependencies in a native activity app - https://github.com/ikonst/android-dl
就其值(value)而言,我是一名使用 Visual Studio 的经验丰富的 C# 开发人员(15 年)。 因此,在开发应用程序时,我认为很多事情都是理所当然的——这是我使用 C++/Android 的第一个项目,似乎更像是一场让一切正常工作的手动战斗!
最佳答案
努力了一段时间,但最终成功地部署了这些库,非常容易。
在解决方案资源管理器中右键单击项目 [theProject (Andorid-xx)] 并选择添加新项目,添加您的 .so 库。
右键单击新添加的库并选择属性,项类型应为库,将内容设置为是,这将部署库。
关于引用动态库的 Android NativeActivity 部署失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980993/