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: Comment puis-je appeler cette méthode avec des arguments de type correct en Java? Strong> 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, J'ai trouvé le pointeur classe mais n'a pas réussi à le faire fonctionner?
Merci beaucoup :) p> p>
3 Réponses :
Le Le taille_t code> 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 code> en Java. P>
void * code> est probablement un pointeur à un objet de type inconnu. Cette question est assez intéressante à ce sujet. Dans Java Objet Code> 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. p>
Ah, bon point. Dans ce cas, long code> en code 32 bits (car il s'agit d'un entier signé de 64 bits), ou BigInteger code> 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 code> est utilisé pour stocker des "objets homologues" dans la JDK elle-même (recherche de awtobject code> et recherchez le pointeur pdata code> si vous êtes intéressé). La source Android utilise également long code> dans le même but. Je pense donc qu'utiliser long code> est la meilleure pratique.
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 Puisque le type Java long code> sur le côté Java pour maintenir les pointeurs C, qui ont été convertis sur le côté JNI de JLONG code> sur VOID * code> ou quel que soit le pointeur Tapez nous avons besoin. P>
Type code> 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. P>
J'ai essayé vos solutions mais je suppose que je n'ai pas vraiment compris correctement ...
J'ai appelé la fonction C comme celle de mon programme Java: p> La fonction C "mycfunction" ressemble à ceci: p> est-ce que ça va faire ça? Cela fonctionne, mais je me demandais si c'est une façon correcte de le faire. P> p>
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.