如何为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签名:
- 先编译你的Kotlin代码,生成class文件
- 打开终端,进入class文件所在目录,执行命令:
javap -s -p com.yourcompany.yourapp.JNILib
- 输出结果里会显示伴生对象的方法信息,比如:
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
相关产品推荐
相关产品推荐

