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

如何为Kotlin伴生对象中声明的外部方法声明C++原生方法?

解决Kotlin伴生对象JNI方法的C++声明问题

这个坑我之前踩过!Kotlin的伴生对象在JNI层面会被处理成目标类的静态内部类,所以你的C++方法命名必须包含Companion,同时还要保证包名和类名的完全匹配——这也是很多人出错的核心原因。

正确的C++方法声明

假设你的Kotlin类JNILib的完整包名是com.yourcompany.yourapp,对应的C++方法应该这样写:

extern "C" JNIEXPORT jstring JNICALL Java_com_yourcompany_yourapp_JNILib_Companion_getAppId(
    JNIEnv* env, jobject companionObj) {
    // 这里返回你的AppId
    return env->NewStringUTF("your-unique-app-id");
}

为什么你的两种写法不对?

  • 第一种写法Java_com_package_JNILib_getAppId:完全忽略了伴生对象的存在,JNI会尝试寻找JNILib类的静态方法,但你的getAppId()是定义在伴生对象里的,自然匹配失败。
  • 第二种写法方向是对的,但大概率是包名不匹配(比如你实际的包不是com.package)或者类名拼写错误,导致JNI找不到对应的方法。

验证技巧:用javap生成准确的签名

如果你不确定方法名是否正确,可以用javap工具生成官方的JNI签名:

  1. 先编译你的Kotlin代码,生成class文件
  2. 打开终端,进入class文件所在目录,执行命令:
javap -s -p com.yourcompany.yourapp.JNILib
  1. 输出结果里会显示伴生对象的方法信息,比如:
public final class com.yourcompany.yourapp.JNILib {
  public static final com.yourcompany.yourapp.JNILib$Companion Companion;
  public static native java.lang.String getAppId();
    descriptor: ()Ljava/lang/String;
  ...
}

对应的JNI方法名就是Java_com_yourcompany_yourapp_JNILib_Companion_getAppId,和我们上面写的完全一致。

内容的提问来源于stack exchange,提问作者L. Swifter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:18