我正在使用JNI处理当前项目,并且在编译期间我的C ++代码出现了一个奇怪的错误。我收到一个错误说明:
错误:没有上下文类型信息的重载功能
这来自以下数组中的“nativegetsupportedciphersuites”行,它将java函数与其C ++对应物进行映射。我已经删除了其他数组成员,以便于阅读。
static JNINativeMethod sSocketImplMethods[] =
{
...
{"nativegetsupportedciphersuites", "()[Ljava/lang/String;", (void*)&Java_mypackage_SocketImpl_nativegetsupportedciphersuites},
...
};
我认为类型声明一定是错误的,但实在没有任何线索。类型声明是由javah函数生成的,所以我认为它是正确的。上述方法的功能签名如下所示:
JNIEXPORT jobjectArray JNICALL Java_mypackage_nativegetsupportedciphersuites(JNIEnv* env, jobject object)
任何想法?
克里斯
答案 0 :(得分:1)
错误消息表明您的方法已超载。编译器无法确定您想要指向哪一个重载,因为它没有任何参数信息。
听起来你不打算重载这个方法。你在任何地方都有第二次声明该方法吗?你是否在标题和正文中使用完全相同的签名?
答案 1 :(得分:0)
通常,您不应该将函数指针强制转换为void * - 某些平台无法使函数指针适合void *。泛型函数指针类型是'void(*)()',但显然你必须在调用函数之前强制转换回正确的类型以避免堆栈损坏。
该错误表明Java_mypackage_nativegetsupportedciphersuites可能存在两个不同的重载(可能是因为.cpp文件中的签名与javah生成的.h文件中的签名不完全匹配),因此无法选择你想要根据你所投射的类型(这只是无效*)。
你是否在源文件中正确地使用了'extern“C”?