【问题标题】:How do I create a shared library in C++ for both Android and iOS?如何在 C++ 中为 Android 和 iOS 创建共享库?
【发布时间】:2016-03-10 23:59:50
【问题描述】:

我正在使用 LibGDX 为 Android 和 iOS 编写应用程序,我希望能够将 C++ 代码添加到我的应用程序中以优化某些部分并移植某些功能等。

我一直在搜索互联网并尝试遵循一些教程,但没有找到我需要的。

我怎样才能编写一个可以加载到 LibGDX 中的非常基本的 C++ 库?我需要使用哪些工具?视觉工作室?我在 Android Studio 中开发。

我认为我需要一个适用于 Android 的 .so 文件和一个适用于 iOS 的 .a 文件,对吗?

【问题讨论】:

    标签: android c++ ios android-ndk libgdx


    【解决方案1】:

    在这两个平台上,都可以直接包含预编译库和 C++ 源代码。

    在 Android 上,您需要考虑使用 Android NDK。这允许您包含可以桥接到 Java 的本机 C/C++ 代码。 Java 和 C/C++ 之间的连接由JNI 管理。对于 C++ 和 Java 之间的通信来说,这是一个相当乏味、笨拙的系统。您需要考虑设置一个 Android.mk 生成文件,该文件指定如何将您的库(或源代码)包含到您的构建中。

    在 iOS 上,它的联系更加紧密。您可以拥有可以运行 C++ 和 Objective-C 代码的 Objective-C++ 文件。如果您使用的是 Swift,它会有些不同(Objective-C++ 和 Swift 之间的桥接)。

    在某些情况下,当平台 (Android/iOS) 提供的功能优于 C++ 可能或现实的功能时,您可能会发现自己正在构建代码,以便您的 C++ 可以根据需要访问平台。这意味着您可能在每个平台上都有带有单独实现文件的标头。

    • thing.h
    • thing_android.cpp
    • thing_ios.mm

    Android 应用的Android.mk 文件将包括thing_android.cpp(但不包括thing_ios.mm)。每当您需要来自 Android SDK 的东西时,该文件可以根据需要通过 JNI 桥与 Java 对话。

    iOS 应用将包含thing_ios.mm(但不包含thing_android.cpp)。 .mm 扩展名表示 Objective-C++,因此文件可以根据需要直接调用强大的 Cocoa 库。

    最后,在所有平台上,您都需要确保将 C++ 的使用缩减到最低公分母平台。换句话说,如果 iOS 支持 C++ 的某个特定功能,而 Android 不支持,那么您就不能使用该特定功能。

    【讨论】:

    • 我不明白您为什么不能这样做 - 对于一些希望保持其库源代码关闭的公司来说,这是一种标准做法。我碰巧使用了 Xcode,为了方便直接测试 iOS 应用程序并快速更改 Objective-C 和 C++ 源代码,但同样,我也将 C++ 代码直接编译到 Android 构建中,它会报告预先编译问题。
    • 谢谢。如何编译为.so.a
    • 取决于您编写代码的位置以及您的偏好。如果您使用的是 OSX,我建议您使用 Xcode。您可以设置一个旨在输出.a 静态库的项目。 (iOS 不能做共享对象)。如果你愿意,你可以有一个专门用于单元测试的构建目标。最后,在 iOS 和 Android 应用程序项目中,您需要包含静态库(通过左侧的项目资源管理器 gui 使用 Xcode,通过 Android.mk makefile 使用 Android)。
    • 另外,对于 Android Studio,您可能想了解如何通过 Gradle 配置 Android.mk makefile 内容。这样,您可以使用强大的 gradle 配置文件集中您的 android 应用配置。
    • 另一个改进是让 iOS 和 Android 应用程序的构建过程包括静态库的编译,将其视为直接依赖项,并使库更新过程在开发过程中更加自动化。我不确定 gradle 会在多大程度上监控这种依赖关系,以及它是否会在你每次编译 Android 项目时构建......但我会在这里停下来,让你带着这些想法开始搜索或询问新的 SO问题。
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2018-10-26
    • 2020-01-03
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多