2010-04-29 3 views
1

Je code quelque chose en utilisant l'API JNI Invocation. Un programme C démarre une JVM et y effectue des appels. Le pointeur JNIenv est global dans le fichier C. J'ai de nombreuses fonctions C qui doivent effectuer la même opération sur une classe donnée de jobject. J'ai donc écrit des fonctions d'aide qui prennent un jobject et le traitent, renvoyant les données nécessaires (un type de données C ... par exemple, une valeur d'état int). Est-il sûr d'écrire des fonctions d'assistance C et de leur passer des jobjects comme arguments?Sécuritaire pour passer des objets aux fonctions C lorsque vous travaillez dans l'API JNI Invocation?

dire (un exemple simple - conçu pour illustrer la question):

int getStatusValue(jobject jStatus) 
{ 
    return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod); 
} 

int function1() 
{ 
    int status; 
    jobject aObj = (*jenv)->NewObject 
    (jenv, 
    aDefinedClass, 
    aDefinedCtor); 

    jobject j = (*jenv)->CallObjectMethod 
    (jenv, 
    aObj, 
    aDefinedObjGetMethod) 

    status = getStatusValue(j); 

    (*jenv)->DeleteLocalRef(jenv,aObj); 
    (*jenv)->DeleteLocalRef(jenv,j); 

    return status; 

} 

Merci.

Répondre

0

Je ne connais pas les détails de JNI, mais une fois que je remarque est la suivante:

return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod); 

Cela ressemble le code officiel JNI et il prend un jobect comme paramètre. Si cela fonctionne pour JNI, il n'y a aucune raison que cela ne fonctionne pas pour votre code.

0

Tous les objets jni sont valides jusqu'à ce que la méthode native retourne. Tant que vous ne stockez pas d'objets jni non globaux entre deux appels jni, tout devrait fonctionner.
L'invocation d'une fonction JNI devrait fonctionner comme ceci:

  1. Java fonction d'appel
  2. créer des références locales natives
  3. fonction native d'appel
  4. faire vos trucs
  5. sortie de la fonction native
  6. libérer les références locales existantes
  7. retourner à java

L'étape 4 peut contenir n'importe quel code, les références locales restent valides jusqu'à l'étape 6 si elles ne sont pas libérées avant.
Si vous souhaitez stocker des objets jni du côté c entre deux appels à une fonction java native, vous devez créer des références globales et les libérer ultérieurement. Ne pas publier une référence globale entraîne des fuites de mémoire car le garbage collector est incapable de libérer les objets Java associés.

+0

J'utilise l'API JNI de C. Invocation Le flux logique est comme ceci: 0. Démarrez JVM en C. 1. Faire un appel de C en Java 2. résultats Manipulez retour de Java. 3. Libérer les références locales. 4. Arrêtez la machine virtuelle Java. Les étapes 1 à 3 peuvent se produire N nombre de fois entre le démarrage et l'arrêt de la JVM. J'ai fait quelques tests et ça semble être OK. La documentation m'a fait peur de passer ces références locales autour ... – bubbadoughball

Questions connexes