Xamarin加载.so文件调用Native方法遇空引用异常求助
Xamarin.Android加载.so库后调用Native方法空引用问题排查方案
先确认库是否真的加载成功
- 别光看
JavaSystem.LoadLibrary没抛异常就默认加载成功,试试用Java.Lang.ClassLoader.FindLibrary("你的库名")检查返回值,要是返回null,说明库根本没被系统找到。 - 检查.so文件的配置:必须放在项目的
lib\对应ABI目录(比如lib\armeabi-v7a、lib\x86),还要把文件的生成操作设为AndroidNativeLibrary,不然打包时不会把库打进APK。
核对Native方法绑定细节
- 先确认.so里的导出方法名:用
nm -D 你的库.so命令能查看所有导出符号,要是是C++编写的库,必须确保Native方法加了extern "C"声明,不然名字会被 mangling,你确认的入口点名字再对也没用。 - C#绑定的签名必须完全匹配:参数类型、返回类型要一一对应,比如Native的
jint对应C#的int,jstring对应C#的string,类型不匹配大概率会触发空引用或崩溃。 - 要是用
DllImport绑定,注意参数格式:
库名不要加[DllImport("你的库名", EntryPoint = "native_method_name")] public static extern int YourNativeMethod(string param);.so后缀,和LoadLibrary里的名字保持一致。
检查ABI兼容性
- 你的设备/模拟器ABI必须和.so编译的ABI匹配,比如你编译的是
armeabi-v7a的库,却在x86模拟器上运行,系统会找不到库,自然调用失败。去项目属性的Android选项里设置支持的ABI,只保留你编译的.so对应的ABI类型。
实用调试技巧
- 调用Native方法前加日志输出:
Android.Util.Log.Debug("LibLoad", $"库路径: {Java.Lang.ClassLoader.FindLibrary("你的库名")}"),确认系统是否真的定位到了库文件。 - 要是用JNI风格绑定(继承
Java.Lang.Object并加[Register]特性),必须确保C#类的全限定名和Native方法的JNI签名对应,比如Native签名是Lcom/your/app/YourClass;->nativeFunc()V,你的C#类命名空间和类名就得是com.your.app.YourClass。
内容的提问来源于stack exchange,提问作者uncle_scrooge
相关产品推荐
相关产品推荐

