如何在C++中为Android和iOS创建一个共享库?

10

我使用LibGDX为Android和iOS编写应用程序,希望能够添加C++代码以优化某些部分并移植一些函数等。

我已经在互联网上搜索并尝试了一些教程,但没有找到我需要的内容。

我该如何编写一个非常基本的C++库,以便可以在LibGDX中加载它?我需要使用哪些工具?Visual Studio吗?我是在Android Studio中开发的。

我认为我需要一个.so文件用于Android和一个.a文件用于iOS,这正确吗?

1个回答

6
在这两个平台上,可以直接包含预编译库和C++源代码。
在Android上,您需要了解使用 Android NDK。这允许您包含本地的C/C++代码,可以连接到Java。Java和C/C++之间的连接由JNI管理。这是一种相当繁琐、笨拙的系统,用于在C++和Java之间通信。您需要查看如何设置一个Android.mk makefile,指定如何将您的库(或源代码)包含到构建中。
在iOS上,它更紧密地链接。您可以拥有Objective-C++文件,可运行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)。这个文件可以通过JNI桥接与Java交流,每当您需要从Android SDK获取某些内容时。
iOS应用程序将包括thing_ios.mm(但不包括thing_android.cpp)。.mm扩展符号表示Objective-C++,所以该文件可以根据需要直接调用强大的Cocoa库。
最后,在所有平台上,您都需要确保将C++的使用降至最低公共分母。换句话说,如果iOS支持C++的某个特定功能,而Android不支持,则不能使用该特定功能。

感谢您提供详尽的答案。我了解了NDK工具链。是否可以使用Visual Studio 2015编写一个跨平台库,为Android / iOS编译生成.so.a文件呢?或者您有什么建议? - Z0q
1
我不明白为什么你不能这样做 - 对于一些想保持库源代码闭源的公司来说,这是标准做法。我碰巧使用了Xcode,因为它方便直接测试iOS应用程序并快速更改Objective-C和C++源代码,但在同样的思路下,我也将C++代码直接编译到Android构建中,这将提前报告编译问题。 - drhr
1
谢谢。我该如何编译成.so.a文件? - Z0q
1
取决于您编写代码的位置和个人偏好。如果您使用的是OSX,我建议使用Xcode。您可以设置一个旨在输出.a静态库的项目(iOS无法执行共享对象)。如果需要,您可以专门为单元测试设置构建目标。最后,在iOS和Android应用程序项目中,您需要包含静态库(通过左侧的项目资源管理器GUI使用Xcode,在Android上通过Android.mk makefile)。 - drhr
1
此外,使用Android Studio时,您可能想了解如何通过Gradle配置Android.mk makefile内容。这样,您就可以将您的Android应用程序配置集中在强大的gradle配置文件中。 - drhr
1
另一个改进是将iOS和Android应用程序的构建过程包括静态库的编译,将其视为直接依赖项,并在开发过程中使库更新过程更加自动化。我不确定gradle会监视该依赖项的程度以及是否会在每次编译Android项目时构建它...但我会在这里停下来,留给你一些思考,开始搜索或提出新的SO问题。 - drhr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接