You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:09:15