Ошибка с JNI (Java и C ++)

0

Я пытаюсь использовать JNI с C++ но он не подходит. Я оправдал все шаги, чтобы вызвать метод C++ из java. но я получаю следующую ошибку (код 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 ?
Показать ещё 5 комментариев
Теги:
jni

1 ответ

0
Лучший ответ

Вам нужно объявить свой C++ метод как extern "C" чтобы гарантировать, что его имя символа не искажено и может быть найдено динамическим компоновщиком:

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

В качестве альтернативы вместо использования сгенерированных имен функций, которые могут быть трудно получить точно, вы можете использовать функцию RegisterNatives() для регистрации собственных методов из вашей JNI_OnLoad().

  • 0
    Спасибо Адам за помощь. Я поместил свой DLL-файл C: \\ Windows \\ System32 \\ KeyLogger.dll, и он работал (он работает как с extern, так и без extern). Я точно не знаю, в чем была проблема, но она решена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню