Failed to register native method com.jni.SoftEngine.JniGetHelpDoc(Ljava/lang/String;)Ljava/lang/String;
这说明 JNI 在注册这个方法的时候失败了,根本原因是:Java 中缺少对应的方法声明,或者签名不匹配,导致 GetMethodID() 或 RegisterNatives() 报 mid == null。

private native String JniGetHelpDoc(String codeName);

根据你提供的两份日志对比,报错的关键问题已经非常明确


✅ 关键错误:

Failed to register native method com.dawn.decoderapijni.SoftEngine.JniGetHelpDoc(Ljava/lang/String;)Ljava/lang/String;

这说明 JNI 在注册这个方法的时候失败了,根本原因是:Java 中缺少对应的方法声明,或者签名不匹配,导致 GetMethodID()RegisterNatives()mid == null


✅ 你的工程两个应用的对比结论:

项目 状态 是否注册成功 JNI 调用是否成功
com.dawn.java ✅ 正常运行 ✅ 成功 ✅ 成功
com.kte.uniformscan ❌ 报错崩溃 ❌ 注册失败 mid == null ❌ JNI 调用崩溃

✅ 最可能原因汇总:

  1. SoftEngine.java 中缺少 JniGetHelpDoc 方法

    • 签名不对或方法根本没写;

    • 比如你 native 层注册的是:

      {"JniGetHelpDoc", "(Ljava/lang/String;)Ljava/lang/String;", (void*)native_func}
      

      但 Java 层没有对应声明:

      public native String JniGetHelpDoc(String arg);
      
  2. 类名不匹配:native 层注册的是 com.dawn.decoderapijni.SoftEngine,但当前运行包名是 com.kte.uniformscan

    • 有可能你的 Java 包名换了,但 SoftEngine 没改包路径;

    • 如果类路径改了,你 JNI 里的类路径就要重新编译匹配。

  3. so 文件未更新或来自旧包

    • 你可能用了正常工程的 so 文件,拷贝到新工程用,但 Java 包路径不同,导致类找不到。


✅ 解决建议(按步骤检查)

🔍 Step 1:检查 SoftEngine.java 是否声明了这个 native 方法:

package com.dawn.decoderapijni;

public class SoftEngine {
    public native String JniGetHelpDoc(String arg);
}
  • 注意类名、包路径都必须 完全匹配 native 层的定义


🔍 Step 2:检查 Android.mkCMakeLists.txt 里是否使用 RegisterNatives 显示注册

比如:

env->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(methods[0]));

如果是手动注册的,那对应的 Java 方法必须写对。否则就会报 Failed to register native method ... mid == null


🔍 Step 3:检查 .so 是不是复制错了

  • 打开 apkbuild/intermediates/merged_native_libs/... 路径,看 lib*/libNlscanHostDecode.so 是不是来自另一个项目。

  • 如果是从 com.dawn.java 拷贝的 .so,而包路径变成了 com.kte.uniformscan,那注册方法时类就对不上。


✅ 快速验证法

你可以在 Java 中临时添加如下方法来测试是否仍然崩溃:

package com.dawn.decoderapijni;

public class SoftEngine {
    public native String JniGetHelpDoc(String arg); // 添加这一行
}

然后重新运行 com.kte.uniformscan,如果不再报 mid == null,就说明找到了问题。


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐