2013-12-24 78 views
0

我想用JNIC++,但它不是正確的我已經證明從java調用c++方法的所有步驟是合理的。但我得到以下錯誤(Java代碼和下面的C++代碼中給出)JNI(Java和C++)的錯誤

的Java代碼是在這裏

public class KeyLogger { 
    public native void capture(); 
    static{ 
     System.loadLibrary("KeyLogger"); 
    } 
    public static void main(String[]args){ 

     KeyLogger obj = new KeyLogger(); 
     obj.capture(); 
    } 
} 

C++代碼在這裏

**// All libraries included Fucntion goes here.** 

JNIEXPORT void JNICALL Java_KeyLogger_capture 
(JNIEnv *env, jobject obj){ 

    cout<<"Working Fine"<<endl; 
} 
void main(){} 

錯誤

Exception in thread "main" java.lang.UnsatisfiedLinkError: KeyLogger.capture()V 
    at KeyLogger.capture(Native Method) 
    at KeyLogger.main(KeyLogger.java:10) 

我應該爲此做些什麼來得到解決

+0

是您公開的捕獲方法嗎? –

+1

你有沒有共享庫在你的'-Djava.library.path'上? –

+0

你的課程'KeyLogger'是否在一個包中?你的C++方法聲明爲'extern「C」'? –

回答

0

你需要聲明你的C++方法爲extern "C",以確保其符號名未進行重整,並可以通過動態鏈接中找到:

extern "C" 
{ 
... 
JNIEXPORT void JNICALL Java_KeyLogger_capture(JNIEnv *env, jobject obj) { 
    ... 
} 
... 
} // end extern "C" 

或者,您可以使用RegisterNatives()函數從您的JNI_OnLoad()例程中註冊本地方法,而不是使用生成的函數名稱難以準確無誤地完成。

+0

感謝Adam的幫助。我把我的DLL文件** C:\\ Windows \\ System32 \\ KeyLogger.dll ** 和它的工作(它與extern和extern都工作)。我不完全知道是什麼問題,但它已解決。 –