MAUI导入.so文件遇System.EntryPointNotFoundException错误排查
库名填写错误
Android平台加载原生库时,DllImport的库名不需要加lib前缀和.so后缀,你的代码中写的是libmlcamera-2.5.so,应该改为mlcamera-2.5,系统会自动补全前缀和后缀。字段初始化时机错误
你在类的字段初始化阶段直接调用nativeCreateCamera(),此时原生库可能还未完成加载绑定,会导致找不到入口点。应该将调用逻辑移到构造函数或其他合适的方法中,示例代码:public class NativeLibs { private const string Library = "mlcamera-2.5"; private long mNativePtr; [DllImport(Library, EntryPoint = "nativeCreateCamera", CallingConvention = CallingConvention.Cdecl)] private static extern long nativeCreateCamera(); public NativeLibs() { mNativePtr = nativeCreateCamera(); // 移到构造函数中调用 } }.so文件存放路径错误
MAUI Android的原生库应该放在Platforms/Android/lib/[abi]/目录下(比如Platforms/Android/lib/arm64-v8a/、Platforms/Android/lib/armeabi-v7a/),而不是Resources/lib/[abi]/,Resources目录用于存放资源文件,原生库放在这里无法被正确加载。csproj配置项错误
应该使用<AndroidNativeLibrary>而非<EmbeddedNativeLibrary>来引用原生库,后者是将文件作为嵌入资源打包,而前者才是Android原生库的正确配置,会将库打包到对应ABI的目录中:<ItemGroup> <AndroidNativeLibrary Include="Platforms/Android/lib/arm64-v8a/libmlcamera-2.5.so" /> <AndroidNativeLibrary Include="Platforms/Android/lib/armeabi-v7a/libmlcamera-2.5.so" /> </ItemGroup>验证原生库的导出符号
确认nativeCreateCamera函数确实在.so文件中被正确导出:
使用Android NDK自带的nm工具执行命令:nm -D libmlcamera-2.5.so | grep nativeCreateCamera如果没有找到对应的符号,说明函数可能被C名字修饰(如果是C编写的库),此时需要在原生代码中用
extern "C"包裹函数声明,避免名字修饰:extern "C" { long nativeCreateCamera() { // 函数实现 } }
内容的提问来源于stack exchange,提问作者LeandroTheDev

