2 votes

Android ne trouve pas la fonction jni correspondante

public native static int convertVideoFrame(ByteBuffer src, 
                                          ByteBuffer dest, 
                                          int destFormat, 
                                          int width, 
                                          int height, 
                                          int padding, 
                                          int swap);

Android me donne qu'il ne peut pas trouver le correspondant JNI fonction.

Les fichiers so sont dans jniLibs dans la bonne carte d'architecture.

Est-ce que cela a quelque chose à voir avec le nom de mon paquet qu'il essaie de trouver dans mon paquet plutôt que dans la bibliothèque so ?

Quand j'exécute ceci, j'obtiens :

No implementation found for native Lorg/telegram/Utilities;.
    convertVideoFrame:(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIIII)I

2voto

Ironman Points 11018

Vous devez compiler le .donc si vous déplacez ou renommez la classe java dans laquelle la méthode native est déclarée, vous devez changer le nom de la méthode native correspondante dans le fichier c. Dans notre cas nous avons le fichier video.c dans le dossier jni . Nous devons mettre à jour le nom de la méthode en fonction du nom du paquet de la classe java qui utilisera cette méthode et aussi ajouter " Java_ "comme préfixe au nom de la méthode. J'espère que cela vous aidera.

1voto

uelordi Points 1622

C'est un problème courant en jni.

Votre fonction native de la classe Android n'est pas en mesure de trouver la fonction à laquelle vous faites référence sur la machine virtuelle.

Il existe différentes façons de reproduire cette erreur :

  1. Votre architecture cible :

Certains appareils utilisent armeabi, armeabi-V7, etc. Essayez donc de faire une compilation croisée dans les deux versions et mettez-les dans jniLibs et créez un dossier pour chaque architecture.

  1. Assurez-vous que les noms de vos fonctions sont corrects

Vérifiez d'abord que vous utilisez la bonne nomenclature dans JNI. Si le nom de votre paquetage java est foo.com et votre classe où vous définissez les fonctions natives est JniManager.java et votre fonction est votreFonction

JNIEXPORT jint JNICALL
            Java_foo_com_JniManger_yourFunction(JNIEnv *env,jobject instance);

Si vous utilisez des fichiers .h, utilisez extern "C".

extern "C"
{
  JNIEXPORT jint JNICALL Java_foo_com_JniManger_yourFunction(JNIEnv*env,jobject instance);
  JNIEXPORT jint JNICALL Java_foo_com_JniManger_yourFunction(JNIEnv*env,jobject instance)
    {
       //your body
    }
}

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