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

Android JNI函数签名匹配异常求助:后缀_00024seeded_1debug问题

解决JNI函数签名不匹配(带模块后缀哈希)的问题

这个问题我之前也碰到过,核心原因是**Kotlin的名称修饰(Name Mangling)**在debug构建中给你的JNI方法名自动添加了模块后缀,导致JNI在查找函数时把后缀转成了带哈希编码的格式(_00024seeded_1debug里的00024是$的Unicode编码,1是下划线的转义)。咱们一步步来解决:

1. 生成正确的JNI函数签名(最稳妥的方法)

不要手动写JNI函数名,直接用Android Studio的工具自动生成,避免拼写错误:

  • 打开你的Kotlin类org.dicekeys.crypto.seeded.PublicKey
  • 右键点击constructFromJsonJNI方法
  • 选择Generate -> C/C++ Function
  • 工具会自动生成带正确后缀的JNI函数签名,比如你看到的Java_org_dicekeys_crypto_seeded_PublicKey_constructJNI_00024seeded_1debug,直接把这个函数复制到你的C/C++代码里实现即可。

2. 用extern "C"避免C++名称修饰干扰

如果你的JNI代码是用C写的,一定要把JNI函数用extern "C"包裹,防止C自己的名称修饰打乱JNI的函数名:

extern "C" JNIEXPORT jlong JNICALL
Java_org_dicekeys_crypto_seeded_PublicKey_constructJNI_00024seeded_1debug(
    JNIEnv* env,
    jclass clazz,
    jstring json_str
) {
    // 你的业务实现代码
}

3. 兼容Debug/Release构建的小技巧

如果不想为debug和release版本写两份函数,可以用预编译宏来自动处理后缀:

#ifdef DEBUG
#define MODULE_SUFFIX "_00024seeded_1debug"
#else
#define MODULE_SUFFIX ""
#endif

extern "C" JNIEXPORT jlong JNICALL
Java_org_dicekeys_crypto_seeded_PublicKey_constructJNI##MODULE_SUFFIX(
    JNIEnv* env,
    jclass clazz,
    jstring json_str
) {
    // 通用实现代码
}

4. 修复Gradle配置中的冗余设置

你的debug构建里有个冗余配置:initWith debug,这相当于自己继承自己,可能导致构建变体出现异常,改成继承release或者直接配置属性:

debug {
    debuggable true
    // 删掉 initWith debug
    jniDebuggable false
    signingConfig signingConfigs.debug
}

5. 彻底清理构建缓存的正确步骤

之前的清理可能没做彻底,试试这套流程:

  • 执行File -> Invalidate Caches...,勾选Clear file system cache and local history,然后重启Android Studio
  • 在终端运行./gradlew clean命令
  • 删除项目根目录的.gradle、build文件夹,以及模块的.iml文件
  • 重新点击Sync Project with Gradle Files,再重新构建项目

6. 规避Kotlin名称修饰的替代方案

如果不想纠结后缀问题,可以把JNI方法声明在Java类里,Java不会添加模块后缀的名称修饰:

  • 创建一个Java类org.dicekeys.crypto.seeded.PublicKeyJNI
  • 在这个类里声明native方法:
    public class PublicKeyJNI {
        public static native long constructJNI(String json);
    }
    
  • 然后在Kotlin的PublicKey类里调用这个Java类的方法即可,此时JNI函数名就是正常的Java_org_dicekeys_crypto_seeded_PublicKeyJNI_constructJNI,不会有奇怪的后缀。

内容的提问来源于stack exchange,提问作者Stuart Schechter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:47:38