10 votes

(JNI) l'objet retourné par le code Java a-t-il besoin de DeleteLocalRef ?

J'ai fait des recherches dans le monde entier pour savoir qu'il faut supprimer la référence locale (DeleteLocalRef) si elle est créée dans un code JNI.
Dans ce cas, dois-je également le supprimer si l'objet est créé et renvoyé par le code Java ? par exemple :

// in java code
public SomeObject funcInJavaCode() {
    return new SomeObject();
}
// in jni code
funcInJNI {
    jobject obj = env->CallObjectMethod(...);
    ...
    // do i have to delete the obj here???
    env->DeleteLocalRef(obj);
}

gracias

5voto

jop Points 2130

Non. Les références locales sont ramassées lorsque la fonction native retourne à Java (lorsque Java appelle native) ou lorsque le thread appelant est détaché de la JVM (lorsque native appelle Java). Vous devez explicitement DeleteLocalRef uniquement lorsque vous avez une fonction native de longue durée (par exemple, une boucle principale) ou lorsque vous créez un grand nombre d'objets transitoires dans une boucle.

0voto

user330844 Points 366

Vous ne pouvez absolument PAS supprimer la référence locale à un objet retourné puisque cet appel libérera la référence à l'objet. Par exemple

    jbitmap = invokeObjectJavaMethod("MFImageToNative", "([B)Landroid/graphics/Bitmap;", byte_array);

    env->DeleteLocalRef(jbitmap);

    return jbitmap;

se plantera, je pense que c'est la responsabilité du consommateur de la méthode de s'occuper de la libération de la référence. Si une âme charitable pouvait apporter des éclaircissements sur la manière de procéder, je lui en serais très reconnaissant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X