JNA - Невозможно получить вызов от нативной функции к функции обратного вызова - PullRequest
2 голосов
/ 30 января 2011

Я использую JNA для вызова функций из DLL-файла.

Для одной из функций требуется указатель на функцию обратного вызова

// Dll function
void MyFunction (*CallBackFnName);

Ниже представлен интерфейс прокси JNA в Java

.
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Pointer;

public interface Dll extends Library {

interface CallBackFnName extends Callback {
    void callback(Pointer dataBuffer, int dataLen);
}


public void MyFunction(Dll.CallBackFnName fn);
public int StartReading(short arg1, short arg2);

}

Согласно API dll, после передачи указателя на функцию обратного вызова на функцию MyFunction (* CallBackFnName) при каждом вызове StartReading () * Функция 1014 * отправляет данные в функцию обратного вызова.

Когда я пытаюсь это сделать, он не вызывает мою функцию обратного вызова. Это также не исключение.

Ниже приведен код, из которого я вызываю функции:

import com.sun.jna.Native;
import com.sun.jna.Pointer;

public class Start {

private static Dll dll = (Dll) Native.loadLibrary("MyDll", Dll.class);
private static Dll.CallBackFnName fn = new Dll.CallBackFnName() {
    @Override
    public void callback(Pointer dataBuffer, int dataLen) {
        System.err.println("Callback function is called successfully");
    }
};

public static void main(String[] args) throws InterruptedException {
    dll.MyFunction(fn); //passed the pointer to the callback function
    short arg1 = 0;
    short arg2 = 0;
    dll.StartReading(arg1, arg2));
    Thread.sleep(10 * 1000);
}
}

После запуска приведенного выше кода, я получаю на консоли следующее:

DeviceAttach: received and accepted attach for vendor id 0x3eb, product id 0x2ffd,         interface 0, device handle 0x037825E8
Main Menu (active Dev/Prod/Interface/Alt. Setting: 0x3eb/0x2ffd/0/0)

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e ("
Read Fail")

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e ("
Read Fail")

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e ("
Read Fail")
Transferred 0 bytes
0  0

1 Ответ

0 голосов
/ 06 мая 2011

Не знаю, нужен ли вам ответ, но кому-то еще, у кого есть эта проблема, У меня была эта проблема раньше. Мне пришлось создать анонимный класс как таковой (используя приведенный выше пример),

dll.myfunc(new Dll.CallBackFnName() {
@Override
public void callback(Pointer dataBuffer, int dataLen) {
    System.err.println("Callback function is called successfully");
} } );

Это сработало для меня. хотя я не могу объяснить почему.

...