2017-06-07 1 views
0

Lorsqu'une méthode définie en C est appelée à partir de Java (en utilisant JNI), quelles sont les méthodes appelées dans la JVM? À quoi ressemble le flux d'exécution?Fonctions JVM appelées en interne sur JNI

  1. En d'autres termes, considérons une méthode public native void display(). Lorsque cette méthode est appelée à partir du code Java sous la forme object.display(), quelles sont les méthodes JVM internes appelées en cours d'exécution vers le code natif?
  2. Où puis-je trouver plus de documentation à ce sujet? Sinon, quelle fonction JVM dans la source puis-je regarder et tracer?
+0

Pour appeler une méthode native, machine virtuelle Java HotSpot entre un talon d'exécution (le fragment de code machine généré au démarrage VM) . Ce bout d'exécution exécute toutes les tâches JNI requises - la procédure est décrite [ici] (https://stackoverflow.com/a/24747484/3448419). – apangin

+0

Les sources d'appel des méthodes natives à partir de l'interpréteur sont dans ['InterpreterGenerator :: generate_native_entry'] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/4d9931ebf861/src/cpu/x86/vm/ templateInterpreter_x86_64.cpp # l960), ou ['SharedRuntime :: generate_native_wrapper'] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/4d9931ebf861/src/cpu/x86/vm/sharedRuntime_x86_64.cpp # l1723) pour appeler des méthodes natives à partir du code compilé par JIT. – apangin

+0

Ce qui précède est vrai pour la JVM HotSpot. D'autres JVM peuvent le faire différemment. – apangin

Répondre

1

Si vous voulez jeter un coup d'oeil à la chaîne exacte d'exécution, je suggère de vous connecter à la machine virtuelle Java en utilisant gdb (ou CLion) et jetez un oeil à backtrace.

Jetez un oeil ici pour voir comment le faire:

http://www.owsiak.org/?p=2095

Vous pouvez également jeter un coup d'oeil ici:

https://www.youtube.com/watch?v=8Cjeq4l5COU

Une fois que vous êtes attaché à JVM, vous pouvez Définissez le point d'arrêt dans votre code C et vérifiez le backtrace de haut en bas.

Vous pouvez créer SIGSEGV et générer toute trace de machine virtuelle Java (jetez un oeil ici: http://jnicookbook.owsiak.org/recipe-No-015/)