92 votes

Android NDK C ++ JNI (aucune implémentation trouvée pour les applications natives ...)

Je suis en train d'utiliser le NDK avec C++ et n'arrive pas à obtenir la méthode de la convention de nommage correct. ma méthode native est comme suit:

extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
   //
}
}

avec un en-tête enveloppée dans extern "C" {} aslo.

Tout compile fine, crée un .donc fichier et copie le dossier libs en vertu de mon projet, mais quand je debug et exécuter dans Eclipse, je reçois un journal de chat message de "non trouvé pour la mise en œuvre indigène...". Il y a une chose qui me manque, comme tous les NDK exemples sont en C?

Merci.

163voto

fadden Points 17450

Il ya un couple de choses qui peuvent mener à de "d'exécution n'a pas trouvé". Est le prototype de fonction nom de mal, une autre est de ne pas charger le .donc à tous. Êtes-vous sûr de ce Système.loadLibrary() est appelée avant que la méthode est-elle utilisée?

Si vous n'avez pas de JNI_OnLoad fonction définie, vous pouvez en créer un et de l'avoir craché un message de journal juste pour vérifier que la lib est se tire avec succès.

Vous avez déjà esquivé le problème le plus commun -- oublier d'utiliser extern "C" -- c'est donc le ci-dessus ou quelque légère faute d'orthographe. Que fait la Java de la déclaration de l'air?

14voto

ademar111190 Points 2855

J'ai eu le même problème, mais pour moi l'erreur était dans le fichier Android.mk. Je l'avais:

 LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 
 

mais devrait avoir ceci:

 LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 
 

notez le détail + = à la place : =

J'espère que ça aide.

4voto

Megha Points 31

4voto

John Twigg Points 456

Une raison supplémentaire: utilisez LOCAL_WHOLE_STATIC_LIBRARIES au lieu de LOCAL_STATIC_LIBRARIES dans android.mk. Cela empêche la bibliothèque d'optimiser les appels d'API inutilisés car le NDK ne peut pas détecter l'utilisation des liaisons natives à partir de code java.

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