引用动态库的 Android NativeActivity 部署失败

标签 android c++ visual-studio-2015 android-ndk

环境……

我有一个全新的 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/

相关文章:

c++ - 将 std::map::emplace 与返回共享指针的函数一起使用是否正确?

c++ - msvc visual c++ 从静态成员函数不正确地形成绑定(bind)成员函数表达式

c++ - 如何在 Visual Studio 2015 中添加第三方库?

c++ - 从函数返回将上下文更改为 NULL

java - 使用 Maven 时在 Eclipse 中更改 Android R.java 的输出文件夹

android - 如何让 LibGDX 只检测一次点击/点击?

c++ - new() 是否也为类的函数分配内存?

Android JNI C/C++ 执行代码的当前工作目录是什么?

android - Dagger 2 : Error about subcomponents, 但我的应用程序中没有任何子组件

c++ - 析构函数中的删除与删除[]