CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++/Java] Utiliser JNI

godrik
godrik
Niveau 30
03 décembre 2012 à 07:28:47

Bonjour a vous,

J'essaye en ce moment d'utiliser la Java Native Interface entre les NativeActivity de Android a la machine virtuelle dalvik. De ce que je comprends, le fonctionnement est le meme pour Android/dalvik et pour une JVM standard de chez oracle.

J'ai trouve cette documentation pour JNI[1]. Mais c'est globalement plus une specification qu'un texte explicatif du bousin. Connaissez vous une documentation ou un texte explicatif plus clair et concis?

Si jamais vous connaissez un peu le sujet, quels sont les objets qui doivent etre libere et de quelle facon doivent ils etre libere? En particulier, quand les appels a la JVM ne sont pas des callback, mais des appels direct, quel est le sens des references locales?

Merci d'avance,

Erik

[1]http://192.9.162.55/docs/books/jni/html/jniTOC.
html

SF-A2
SF-A2
Niveau 5
03 décembre 2012 à 16:09:55

Sun a une très bonne documentation sur JNI, avec une section justement dédiée au C++, je te conseille d'y faire un tour.

Aldebran
Aldebran
Niveau 10
04 décembre 2012 à 23:52:40

"Si jamais vous connaissez un peu le sujet, quels sont les objets qui doivent etre libere et de quelle facon doivent ils etre libere? En particulier, quand les appels a la JVM ne sont pas des callback, mais des appels direct, quel est le sens des references locales? "

Tu fais des appels natifs vers Java ou Java vers natif ?

Globalement lors d'appels JNI natifs vers Java (un exécutable C se connecte à une JVM ou en créer une, puis appelle les fonctions de la JVM), il faut systématiquement supprimer les références sur tout ce que te retourne la JVM. Si la JVM te retourne une référence locale sur un objet, il faudra appeler DeleteLocalRef sur cette référence dès que tu n'en auras plus besoin. A noter que les jclass sont aussi des références locales, il faut donc les libérer dès que ce n'est plus nécessaire. Les fonctions PushFrame et PopFrame peuvent être utiles pour gérer les références locales.

Si tu fais de l'appel Java vers natif (une JVM fait appel à des fonctions d'une bibliothèque natives) alors tu n'as pas à te soucier (ou presque) de la gestion des références locales dans ton code natif, ces dernières seront supprimées lorsque la fonction native se terminera.

godrik
godrik
Niveau 30
05 décembre 2012 à 00:08:02

Mon code C appelle des fonctions dans la JVM. Il est possible que ce code C soit lui meme appelle par la meme JVM. (Je ne suis toujours pas completement sur de ce qu'android fait avec native activity.) Et si j'ai bien compris, les acces a la JVM se font de facon concurente depuis plusieurs threads differents.

Si j'ai besoin de garder une reference pour un appel ulterieur, il faut que j'en fasse une reference globale non? mais dans ce cas, est ce que je dois aussi relacher la reference locale dont la copie est issue?

Ce PushFrame/PopFrame pourrait me simplifier la vie.

Aldebran
Aldebran
Niveau 10
05 décembre 2012 à 08:16:03

"Si j'ai besoin de garder une reference pour un appel ulterieur, il faut que j'en fasse une reference globale non? mais dans ce cas, est ce que je dois aussi relacher la reference locale dont la copie est issue? "

Oui il faut faire une référence globale pour une utilisation ultérieure et il faut bien relâcher la référence locale correspondante.

godrik
godrik
Niveau 30
06 décembre 2012 à 00:04:46

ok merci!

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment