Visual Studio 2022下.NET MAUI项目引入.so库遭DllNotFoundException
问题:Android平台引入C++ .so库时抛出System.DllNotFoundException
我在Android应用中尝试引入C++编译的.so库,编写了以下代码:
const string DllName = "libHelloWorld.so"; [DllImport(DllName, EntryPoint = "HelloWorld")] internal static extern string getHelloWorld(LibraryFuncsSafeHandle ptr);
无论将libHelloWorld.so放在项目的lib/、Platforms/Android/lib/、resources/lib/等目录,甚至在DllName中使用完整路径,都会抛出异常:System.DllNotFoundException: 'libHelloWorld.so'。我试过各类推荐的存放位置均无效,部分方案提到要配置链接器路径,但在Visual Studio中找不到Android相关的链接器设置(已单独提问该问题)。现咨询这段代码是否存在明显错误,或是有其他遗漏的配置步骤。
代码层面的检查点
- EntryPoint与C++函数名匹配:确认C侧导出的函数名是否为
HelloWorld。C默认会对函数名进行名字修饰(name mangling),如果没有用extern "C"声明导出函数,实际导出的函数名会被篡改,导致DllImport找不到入口点。必须确保C++代码中这样声明:extern "C" { const char* HelloWorld(void* ptr); } - 返回值类型兼容性:C#代码声明返回
string,对应C侧的返回值必须是const char*,且字符串编码为UTF-8——.NET会自动完成const char*到string的转换,但如果C侧是动态分配的内存,需注意后续内存释放逻辑,避免泄漏。 - SafeHandle类型匹配:确认
LibraryFuncsSafeHandle的底层指针类型与C函数接收的指针类型一致(比如C侧是void*,则SafeHandle要对应),类型不匹配可能引发调用异常,甚至间接导致库加载失败。
库文件放置与打包配置
- 正确的目录结构:Android项目中,
.so必须放在Platforms/Android/libs/<abi>/目录下,<abi>为目标架构(如armeabi-v7a、arm64-v8a、x86)。比如你的库是arm64-v8a架构,就放到Platforms/Android/libs/arm64-v8a/libHelloWorld.so。 - 设置生成操作:选中
.so文件,在属性窗口将生成操作设为AndroidNativeLibrary,Visual Studio才会将其打包到APK的lib/<abi>/目录下,否则文件不会被打包进APK,自然无法找到。 - 禁止使用完整路径:Android应用运行时的文件系统路径是动态的,开发时的本地路径在安装后完全无效,必须依赖系统的库加载机制,通过正确目录和生成操作让系统自动识别。
其他遗漏检查项
- ABI兼容性:在项目属性的Android选项→高级设置中,确认支持的ABI包含你的
.so库对应的架构。如果库是arm64-v8a,但应用未勾选该ABI,会因架构不匹配导致加载失败。 - 依赖库检查:如果
libHelloWorld.so依赖其他.so(如C++标准库、第三方库),需将这些依赖库也放到对应ABI目录中,否则主库会因缺少依赖而加载失败,表现为找不到主库的异常。
内容的提问来源于stack exchange,提问作者simonsays
相关产品推荐
相关产品推荐

