2010-08-02 149 views
0

我正在使用JNI處理當前項目,並且在編譯期間從我的C++代碼中得到一個奇怪的錯誤。我得到一個錯誤,指出:
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) 


任何想法?

Chris

回答

1

錯誤消息指示您的方法已過載。由於編譯器沒有任何參數信息,因此無法確定您想要指向哪一個重載。

這聽起來像你不打算超載的方法。你有沒有在任何地方再次聲明該方法?你是否在標題和正文中使用完全相同的簽名?

+0

謝謝JSBangs!我在頭文件聲明中略有差異。 – Chrisc 2010-08-02 16:01:35

0

通常,您不應該將函數指針轉換爲void * - 某些平臺無法將函數指針放入void *中。泛型函數指針類型爲'void(*)()',但顯然你必須在調用函數之前將其返回到正確的類型以避免堆棧損壞。

錯誤提示Java_mypackage_nativegetsupportedciphersuites可能存在兩種不同的重載(可能是因爲.cpp文件中的簽名與javah生成的.h文件中的簽名不完全匹配),因此無法選擇你想要基於你正在投射的類型(這只是void *)。

您是否在源文件中正確放置了'extern「C」'?