2012-08-22 2 views
1

J'ai cherché mais je n'ai pas trouvé de réponse à ce "problème". Fondamentalement, il faut généralement inclure l'en-tête jni.h pour accéder aux fonctions jni, mais l'en-tête contient principalement des prototypes de fonctions et des déclarations struct, donc nous incluons les sources pour résoudre les fonctions ou inclure une bibliothèque statique ou dynamique.) afin que l'éditeur de liens puisse résoudre les déclarations de prototypes de fonctions. J'ai déjà utilisé le NDK Android pour construire une bibliothèque native et tout ce que j'ai fait était d'inclure l'en-tête jni.h pour utiliser les fonctions jni, mais même sur la documentation et les exemples d'Oracle, tout ce qu'ils font est d'inclure l'en-tête jni.h et spécifiez inclure des répertoires au compilateur, alors comment le compilateur trouve-t-il les implémentations?JNI et la bibliothèque à laquelle elle est liée

+0

La documentation se réfère à jvm.lib. – EJP

Répondre

0

Comment le compilateur trouve-t-il les implémentations?

Le compilateur n'a pas à trouver les implémentations, la machine virtuelle Java vous indique où ils sont dynamiquement:

JNIEnv est un typedef pour la struct JNIEnv_. Cette structure contient un const struct JNINativeInterface_* appelé functions et de nombreuses méthodes. Si vous jetez un oeil à la JNI documentation vous remarquerez que la plupart des méthodes ont un JNIEnv* comme premier argument, mais vous les appelez avec env->method(...), sans l'argument JNIEnv*. Les méthodes de la documentation sont les méthodes réelles et les pointeurs sont dans functions dans JNIEnv_. Les méthodes dans JNIEnv_ sont des wrappers qui appellent simplement les indicateurs de méthode dans functions. Chaque fois que la JVM crée un JNIEnv_ et le JNINativeInterface_ correspondant, elle écrit dynamiquement toutes les adresses de méthode.

Questions connexes