Question

Je suis en train d'utiliser le NDK avec C ++ et ne peut pas sembler obtenir la convention de nommage de méthode. ma méthode native est la suivante:

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 bien, crée un fichier .so et copie dans le dossier libs dans mon projet, mais quand je debug et exécuter dans Eclipse je continue à avoir un message de chat de journal de « aucune implémentation trouvée pour natif ... ». Y at-il quelque chose que je suis absent que tous les exemples NDK sont en C?

Merci.

Était-ce utile?

La solution

Il y a deux choses qui peuvent conduire à « aucune mise en œuvre trouvée ». L'un est d'obtenir le nom du prototype de mauvaise fonction, une autre est le échec du chargement .donc du tout. Etes-vous sûr System.loadLibrary() est appelée avant la méthode est utilisée?

Si vous ne disposez pas d'une fonction de JNI_OnLoad définie, vous pouvez créer un et avoir craché un message de journal juste pour vérifier que la lib est de se tiré dans avec succès.

Vous avez déjà esquivé le problème le plus commun - oublier d'utiliser extern "C" - il est donc soit au-dessus ou d'une légère faute d'orthographe. Qu'est-ce que la déclaration de Java ressembler?

Autres conseils

Une autre cause de cette erreur: le nom de la méthode native undecorated ne doit pas contenir un trait de soulignement

Par exemple, je voulais exporter une fonction C nommée AudioCapture_Ping(). Voici ma déclaration d'exportation dans C:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object);  //Notice the underscore before Ping

Voici été ma classe Java importe la fonction:

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapture_Ping();  // FAILS
    ...

Je ne pouvais pas Android pour lier dynamiquement à ma méthode native jusqu'à ce que j'enlevé le trait de soulignement:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); 

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapturePing();  // THIS WORKS!
    ...

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

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

mais devrait avoir ceci:

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

noter les détails + = au lieu : =

J'espère que cela aide.

appelé extern « C » comme il est prévu dans l'exemple studio généré automatiquement, mais il a oublié d'envelopper tout le reste du dossier, y compris les fonctions suivantes, entre parenthèses {}. Seule la première fonction a travaillé.

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

scroll top