7
votes

Convertir Void ** Pointeur en type Java équivalent

Je charge une DLL C d'un programme écrit en Java. Je veux pouvoir appeler l'une des méthodes de la DLL avec cette déclaration: xxx

Comment puis-je appeler cette méthode avec des arguments de type correct en Java? Je sais (théoriquement) comment l'appeler, mais ce que j'aimerais savoir, c'est comment transmettre le "vide **" et "taille_t *" de mon programme Java? Fondamentalement, je veux savoir ce que le "type équivalent" pour annuler et size_t *** est en java ...

J'ai trouvé le pointeur classe mais n'a pas réussi à le faire fonctionner? Merci beaucoup :)


1 commentaires

Tu ne le fais pas. Les concepts ne sont pas mappables. Vous devez comprendre comment les valeurs seront utilisées et "tricher". Ou écrire une wrapper C.


3 Réponses :


1
votes

Le taille_t est un entier utilisé pour la taille d'une variable en mémoire; En tant que tel, vous devez être en sécurité en utilisant non signé long en Java.

Le void * est probablement un pointeur à un objet de type inconnu. Cette question est assez intéressante à ce sujet. Dans Java Objet est généralement utilisé dans ce cas, mais je ne sais pas comment vous allez convertir entre eux, bien que Cette question pourrait vous aider ici.


2 commentaires

Ah, bon point. Dans ce cas, long en code 32 bits (car il s'agit d'un entier signé de 64 bits), ou BigInteger en code 64 bits. Penser à ce sujet, alors logez que vous ne faites rien dans le code Java, vous pourrez peut-être vous éloigner avec une longue durée de 64 bits, tant que la conversion entre Java et la langue maternelle ne 't manglez-le et peut réinterpréter le binaire comme s'il s'agissait d'une taille_t.


J'ai lu le code source JDK. Long est utilisé pour stocker des "objets homologues" dans la JDK elle-même (recherche de awtobject et recherchez le pointeur pdata si vous êtes intéressé). La source Android utilise également long dans le même but. Je pense donc qu'utiliser long est la meilleure pratique.



2
votes

J'ai travaillé sur un projet Java / JNI / C Il y a plusieurs années, et nous avons dû maintenir des indicateurs opaques C au sein des objets Java. Nous avons utilisé des valeurs long sur le côté Java pour maintenir les pointeurs C, qui ont été convertis sur le côté JNI de JLONG sur VOID * ou quel que soit le pointeur Tapez nous avons besoin.

Puisque le type Java Type est de 64 bits larges et les pointeurs JNI / C sont généralement 32 bits ou 64 bits de large, nous n'avions aucun problème à convertir entre eux.


0 commentaires

0
votes

J'ai essayé vos solutions mais je suppose que je n'ai pas vraiment compris correctement ... mais j'ai résolu mon problème en utilisant ceci: xxx

J'ai appelé la fonction C comme celle de mon programme Java: xxx

La fonction C "mycfunction" ressemble à ceci: xxx

est-ce que ça va faire ça? Cela fonctionne, mais je me demandais si c'est une façon correcte de le faire.


0 commentaires