uni-app 打包含有第三方室内定位插件的app时运行插件闪退 报com.facebook.jni.HybridData的错

发布于 1周前 作者 itying888 来自 Uni-App

uni-app 打包含有第三方室内定位插件的app时运行插件闪退 报com.facebook.jni.HybridData的错

开发环境 版本号 项目创建方式
Windows win11 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:win11

HBuilderX类型:正式

HBuilderX版本号:3.98

手机系统:Android

手机系统版本号:Android 13

手机厂商:小米

手机机型:小米civi

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

操作步骤:

  • 打开第三方插件时候直接闪退

预期结果:

  • 打开第三方插件时候直接正常运行

实际结果:

  • 闪退

bug描述: 当前我们有一个安卓的sdk,这个sdk使用了pytorch_android-1.8.0.aar 在该sdk中引用了jni,分别是libpytorch_jni.so和libfbjni.so

将对应的SDK打包成uniapp所需要的插件之后,现在运行时存在找不到 libfbjni.so 中的方法的情况,错误为:

java.lang.ClassNotFoundException: com.facebook.jni.HybridData
at org.pytorch.NativePeer.initHybrid(Native Method)
at org.pytorch.NativePeer.<init>(NativePeer.java:25)
at org.pytorch.Module.load(Module.java:25)
at org.pytorch.Module.load(Module.java:35)

查看apk包,发现对应的目录中都有对应的so文件,且对应的cpu架构确认也是没有问题的。

这是闪退日志

BOARD:zijin
BOOTLOADER:unknown
BRAND:Xiaomi
CPU_ABI:arm64-v8a
CPU_ABI2:
DEVICE:zijin
DISPLAY:TKQ1.220807.001 test-keys
FINGERPRINT:Xiaomi/zijin/zijin:13/TKQ1.220807.001/V14.0.6.0.TLPCNXM:user/release-keys
HARDWARE:qcom
HOST:pangu-build-component-system-388170-tfp97-p073c-75mq3
ID:TKQ1.220807.001
IS_DEBUGGABLE:false
IS_EMULATOR:false
IS_MIUI:true
MANUFACTURER:Xiaomi
MODEL:2109119BC
ODM_SKU:zijin
PERMISSIONS_REVIEW_REQUIRED:true
PRODUCT:zijin
RADIO:unknown
SERIAL:unknown
SKU:zijin
SOC_MANUFACTURER:QTI
SOC_MODEL:SM7325
SUPPORTED_32_BIT_ABIS:[Ljava.lang.String;[@b24a814](/user/b24a814)
SUPPORTED_64_BIT_ABIS:[Ljava.lang.String;[@d49d8bd](/user/d49d8bd)
SUPPORTED_ABIS:[Ljava.lang.String;[@7a90eb2](/user/7a90eb2)
TAGS:release-keys
TIME:1697101476000
TYPE:user
UNKNOWN:unknown
USER:builder
java.lang.ClassNotFoundException: com.facebook.jni.HybridData
at org.pytorch.NativePeer.initHybrid(Native Method)
at org.pytorch.NativePeer.<init>(NativePeer.java:25)
at org.pytorch.Module.load(Module.java:25)
at org.pytorch.Module.load(Module.java:35)
at cn.whu.cs.niu.PDR.IMUCollectorZY$b.invoke(IMUCollectorZY.kt:2)
at cn.whu.cs.niu.PDR.IMUCollectorZY$b.invoke(IMUCollectorZY.kt:1)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

1 回复

在使用 uni-app 开发应用时,如果集成了第三方室内定位插件,并且在打包后运行时出现闪退,并报 com.facebook.jni.HybridData 相关的错误,可能是由于以下原因导致的:

1. JNI 库未正确加载

  • com.facebook.jni.HybridData 是 Facebook 的 JNI 库的一部分,通常与 React Native 或某些第三方库相关。如果插件依赖了这些库,但未正确加载,可能会导致闪退。
  • 解决方案
    • 确保在 build.gradle 文件中正确引入了相关的依赖库。
    • 检查是否有缺失的 .so 文件(JNI 库文件),确保它们被打包到 APK 中。

2. 插件与 uni-app 的兼容性问题

  • 某些第三方插件可能与 uni-app 的框架不兼容,尤其是在涉及到 JNI 或原生代码时。
  • 解决方案
    • 检查插件的文档,确保它支持 uni-app 或 HBuilderX 的环境。
    • 如果插件提供了示例项目,尝试在原生 Android 项目中运行,确认插件本身没有问题。

3. 混淆配置问题

  • 如果启用了代码混淆(ProGuard 或 R8),可能会导致 JNI 相关的类或方法被错误地混淆,从而导致闪退。
  • 解决方案
    • proguard-rules.proconsumer-rules.pro 中添加规则,确保 com.facebook.jni.HybridData 及其相关类不被混淆。例如:
      -keep class com.facebook.jni.** { *; }

4. 插件初始化问题

  • 插件可能需要在应用启动时进行初始化,如果初始化失败,可能会导致闪退。
  • 解决方案
    • 检查插件的文档,确保在 App.vuemain.js 中正确初始化插件。
    • 如果插件需要在原生代码中初始化,确保在 Application 类或 MainActivity 中进行了正确的初始化。

5. NDK 版本不兼容

  • 如果插件使用了特定的 NDK 版本,而你的项目配置了不同的 NDK 版本,可能会导致兼容性问题。
  • 解决方案
    • 检查插件的文档,确认所需的 NDK 版本。
    • local.properties 中指定正确的 NDK 版本,例如:
      ndk.dir=/path/to/ndk/version

6. 缺少必要的权限或配置

  • 某些插件可能需要特定的权限或配置,如果未正确配置,可能会导致闪退。
  • 解决方案
    • 检查插件的文档,确保在 AndroidManifest.xml 中添加了所有必要的权限和配置。
    • 例如,室内定位插件可能需要以下权限:
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

7. 调试和日志

  • 如果以上方法都无法解决问题,可以通过调试和日志来进一步分析问题。
  • 解决方案
    • 使用 adb logcat 查看详细的崩溃日志,定位具体的错误原因。
    • 在代码中添加日志,检查插件的初始化过程是否正常。

8. 联系插件开发者

  • 如果问题依然无法解决,建议联系插件的开发者,提供详细的错误日志和复现步骤,寻求帮助。

示例代码(ProGuard 规则)

# 保持 Facebook JNI 相关类不被混淆
-keep class com.facebook.jni.** { *; }

示例代码(AndroidManifest.xml 权限)

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!