2013-12-24 45 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都工作)。我不完全知道是什么问题,但它已解决。 –