android - 如何在 Visual Studio 的 Android 共享库 (.so) 项目中正确使用 c++ 静态库 (.lib)?
问题描述
我需要为一个项目创建一个 .so Android 共享库,并且我需要使用来自 C++ 静态库 (.lib) 的函数。.so 库只是用作桥梁,因此我可以在 Android 应用程序和游戏中使用我的静态库中的函数。我在 Visual Studio 2017 中创建了一个 C++ 跨平台 Android 项目(也在 VS2019 中对其进行了测试),包括静态库的头文件和库本身,并且所有内容都在理论上进行了配置和链接。
我正在使用的当前库是一个简单的静态库,用于测试,只有一个函数:
namespace StaticLibrary
{
extern "C" void Func()
{
// something
}
}
Android 的文件如下所示:
#include "StaticLibraryHeader.h"
extern "C"
{
// ...
void StaticLibFunc()
{
StaticLibrary::Func();
}
}
当我尝试编译项目时,编译器说:
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Build\x64\Debug\libStaticLibTest_x64_Debug.lib: bad extended name index at 778
和:
undefined reference to 'Func'
我可以通过使用链接器的 --whole-archive 选项来消除第二个错误,但随后会出现这个新错误以及第一个错误:
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: fatal error: F:\Android_IOS_libs\MobileLibraries2019\Build\x64\Debug\libStaticLibTest_x64_Debug.lib: attempt to map 60 bytes at offset 6324 exceeds size of file; the file may be corrupt
我还使用 Google Lib2A ( https://code.google.com/archive/p/lib2a/ ) 创建了一个 .a 文件,但随后发生以下错误:
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 192 is not an ELF object
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 870 is not an ELF object
C:\\Microsoft\AndroidNDK64\android-ndk-r16b\toolchains\x86_64-4.9\prebuilt\windows-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin\ld: error: F:\Android_IOS_libs\MobileLibraries2019\Krilloud_Android\lib\x64\libStaticLibTestDLL_x64_Debug.a: member at 1656 is not an ELF object
我不是 Android/Java 开发人员,所以我在这里迷路了。如何在 .so 项目中正确链接和使用我的静态库?可以使用 Visual Studio 完成,还是我真的需要为此安装 Android Studio?我还需要为 iOS 创建相同的东西,所以我希望在 Visual Studio 解决方案中拥有这两个项目。
解决方案
推荐阅读
- performance - 高效搜索除 std::set 中用于排序的元素之外的元素
- azure-data-lake - SQL Polybase 外部表 - 处理文件元数据
- java - 在 Java 中分析和导入 EEG 信号
- laravel - Laravel 队列:作业有时会执行两次或三次
- javascript - 在嵌入式 Calendly 小部件中安排事件时如何运行代码?
- elasticsearch - 启用 elasticsearch 安全功能后 Elasticsearch.service 失败
- python-2.7 - 是否可以通过在 Tkinter 中读取保存的文件来创建按钮
- javascript - 如何使用 Krpano 中 db/json 源中的 lat、long 值动态添加热点
- ios - Nativescript 应用程序在 iOS 14 上是否存在问题?
- javascript - npm "这个版本的 'buffer' 已经过时了。" 您必须更新到 v4.9.2 或更高版本