JNA - метод обратного вызова с аргументом typedef struct ** - PullRequest
0 голосов
/ 22 февраля 2019

Я использую C dll с этим кодом:

1)

AIC_BRIDGE_API AIC_ERROR_CODE aic2_set_cb_function (
    void (*cb2_start_dsts) (AIC2_DSTS_START_STOP),
    void (*cb2_stop_dsts) (AIC2_DSTS_START_STOP),
    void (*cb2_dsts_rcvd_ex) (unsigned int, unsigned long *, char *, AIC2_DSTS_STO),
    void (*cb2_log) (const char *, int, const char *, int)
);

2)

aic2_set_cb_function (NULL, NULL, cb2_dsts_rcvd_ex, NULL);

DLL работает во многих приложениях с C / C ++и .Net код.Мой код на Java такой:

1)

public interface ReadCallbackInt extends Callback {
    void invoke(int iNumDv, Pointer pMicDv, String pcARName, AIC2_DSTS_STO.ByValue sto);
}

2)

public void aic2_set_cb_function(StartDSCallbackInt fn1, 
                           StopDSCallbackInt fn2, 
                           ReadCallbackInt fnReadCB,
                           LogCallbackInt fn4);

3)

TestLib.ReadCallbackInt fnReadCB = new TestLib.ReadCallbackInt() {
    long[] IntArray;

    @Override
    public void invoke(int iNumDv, Pointer pMicDv, String pcARName, AIC2_DSTS_STO.ByValue sto) {
        if (sto.bTsNamePres > 0) {
            System.out.println("iNumDv: " + iNumDv);
            System.out.println("pMicDv: " + pMicDv);
            System.out.println("pcARName: " + pcARName);
            System.out.println("sto: " + sto.TsName);
            if (pMicDv!=null) {
                IntArray = new long[iNumDv]; 
                IntArray = pMicDv.getLongArray(0, iNumDv);
                if (IntArray != null) {
                    System.out.println("IntArray: " + IntArray +" First El. " + IntArray[0]);
                }
            }
        }
    }
}      

............... ...............

4)

TestLib.INSTANCE.aic2_set_cb_function(null, null, fnReadCB, null);

Проблема в том, что в IntArray Iполучить все элементы как ноль.Вы можете помочь мне?

5) Оригинальный код C:

void cb2_dsts_rcvd_ex (unsigned int iNumDv, unsigned long *piMicDv, char *pcARName, AIC2_DSTS_STO sto)

{
    unsigned int i;
    AIC2_DV *pdv;

    printf ("\nRemote %s: ", pcARName);
    if (sto.bTsNamePres)
        printf ("Report (%s/%s) received\n", sto.TsName.pcDomainName, sto.TsName.pcName);
    else
        printf ("Report (unknown) received\n");
    for (i = 0; i < iNumDv; i++)
        if (piMicDv[i] != AIC_ID_DV_INVALID)
        {
            pdv = aic2_get_dv_info (piMicDv[i]);
            log_data_values_aic2 (pdv, stdout);
            if (pdv) aic2_free_dv_info(pdv);
        }
}
...