Eclipse comstack avec succès mais donne toujours des erreurs sémantiques

NOTE: il semble qu’il s’agisse d’une question récurrente sur StackOverflow, mais pour ce que j’ai vu, les gens ne trouvent jamais un moyen ou leur solution ne fonctionne pas pour moi.

Le problème:

J’utilise Eclipse Juno ADT. Tout fonctionnait bien jusqu’à ce que j’essaye de mettre à jour le NDK. J’ai remplacé mon dossier ndk ( ndk-r8d ) par la nouvelle version ( ndk-r8e ) et, dans ma configuration Paths and Symbols , j’ai modifié l’ ndk-r8e pour passer de g ++ 4.6 à 4.7.

Cela semblait briser mon index: je pouvais comstackr mon code, mais Eclipse donnait des erreurs sémantiques, exactement comme dans [ 1 ] et [ 2 ]. Les erreurs proviennent principalement du symbole utilisé par OpenCV4Android, comme distance , pt , queryIdx et trainIdx .

Lorsque j’ai essayé de sauvegarder dans mon ancienne configuration, l’index était toujours cassé! Je ne peux pas trouver un moyen de changer cela.


Ce que j’ai essayé

  • Nettoyer le projet
  • Reconstruire, actualiser et toutes les autres options du sous-menu “Index” (lorsque vous cliquez avec le bouton droit de la souris sur le projet)
  • Désactiver / activer l’indexeur dans les préférences
  • Vérifiez que les symboles tels que trainIdx apparaissent uniquement dans mon fichier OpenCV4Android dans la section Paths and Symbols .
  • Modifier l’ordre de mes inclus dans la section Paths and Symbols . J’ai essentiellement essayé de mettre l’inclus OpenCV au début et à la fin.

Quelques observations

Ce qui ne fonctionne pas

Je suppose que c’est l’ indice CDT à cause de ce qui suit:

  • En ligne de commande, je peux construire mon projet en utilisant ndk-build clean et ndk-build .
  • Lorsque je lance Eclipse, je n’ai pas d’erreur avant d’ouvrir un fichier C ++ (à partir du dossier jni ).
  • Je peux toujours construire le projet, mais tant que j’ai ouvert un fichier C ++, je ne peux plus exécuter l’application car beaucoup de Field '' could not be resolved.
  • Si je n’ouvre pas les fichiers C ++, Eclipse ne signale aucune erreur et peut créer et déployer l’application Android avec succès.

Fait intéressant

Le code suivant signale des erreurs en line , queryIdx , pt :

 cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0); 

Si je l’écris comme suit, cela fonctionne:

 cv::DMatch tmpMatch = matches[i]; cv::KeyPoint queryKp = keypointsA[tmpMatch.queryIdx]; cv::KeyPoint trainKp = keypointsB[tmpMatch.trainIdx]; cv::line(mRgb, queryKp.pt, trainKp.pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0); 

Ce n’est pas que toutes les fonctions OpenCV ne sont pas résolues: seuls pt , queryIdx et trainIdx sont.

Tout commentaire sera vraiment apprécié.

Dans les préférences de projet que vous avez sélectionnées dans l’environnement Eclipse, accédez à Général C / C ++ -> Analyse de code -> Lancement. Assurez-vous que les deux cases à cocher ne sont pas cochées. Fermez et rouvrez le projet ou redémarrez l’éclipse et reconstruisez le projet.

L’indexation pour le code natif d’Android sur Eclipse étant incomplète, j’ai réussi à activer l’indexation de manière non intuitive dans mes projets NDK, cela devrait fonctionner que vous ndk-build ou plain make ou même cmake . J’utilise Kepler mais ça devrait fonctionner aussi avec les anciennes versions.

Obtenez votre chaîne d’outils à droite

  • Faites un clic droit sur le projet -> Properties -> C/C++ Build -> Tool Chain Editor -> Décochez Display compatible toolchains only .
  • Dans la même fenêtre, définissez Current toolchain d’ Current toolchain sur Linux GCC .
  • Dans la même fenêtre, définissez Android Builder Current builder sur Android Builder si vous utilisez ndk-build , définissez-le sur Gnu Make Builder cas contraire (cette étape peut être erronée, désolé si c’est le cas).
  • Faites un clic droit sur le projet -> Properties -> C/C++ Build -> Build Variables -> Assurez-vous que la Build command lit la commande correcte pour votre projet; si ce n’est pas le cas, décochez Use default build command et corrigez-la (cela peut être ndk-build ou make -j5 que vous voulez). Si vous créez le code natif dans un terminal distinct, vous pouvez ignorer cette étape.

Créer une chaîne d’outils autonome, c’est probablement le moyen le plus propre d’obtenir des sources STL au même endroit

  • Accédez au répertoire racine de NDK.
  • Exécutez les opérations suivantes (ajustez les parameters à votre guise). Ajoutez sudo si vous ne disposez pas d’permissions en écriture sur le --install-dir car le script échoue silencieusement.

      ./build/tools/make-standalone-toolchain.sh \ --platform=android-14 \ --install-dir=/opt/android-toolchain \ --toolchain=arm-linux-androideabi-4.8 
  • Cela suppose que vous utilisez GNU-STL. Si vous utilisez une autre bibliothèque C / C ++, vous devrez modifier la commande ci-dessus et probablement aussi les chemins d’inclusion dans la commande suivante.

Ajouter les chemins d’inclusion nécessaires à votre projet

  • Faites un clic droit sur le projet -> Properties -> C/C++ General -> Paths and Symbols -> Accédez à l’onglet Includes -> Sélectionnez GNU C++ dans les Languages -> Cliquez sur Add et ajoutez les chemins suivants (en supposant que vous avez installé la chaîne d’outils autonome sur /opt/android-toolchain ):

    • /opt/android-toolchain/include/
    • /opt/android-toolchain/include/c++/4.8/
    • /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include/
    • /opt/android-toolchain/include/c++/4.8/backward/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include-fixed/
    • /opt/android-toolchain/sysroot/usr/include/
  • Ici, vous pouvez append chaque chemin d’inclusion souhaité. En fait, j’ai mon OpenCV construit pour Android et installé dans la chaîne d’outils autonome, donc j’ai les éléments suivants:

    • /opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/

Maintenant, l’indexation devrait fonctionner. Vous devriez également pouvoir exécuter ndk-build (ou make si c’est votre méthode de construction), puis déployer votre projet sur votre appareil dans Eclipse.

Pourquoi?

Le développement natif Android sur Eclipse est incomplet car l’indexation ne fonctionne pas immédiatement. Cela est dû à la nécessité de prendre en charge plusieurs architectures (ARMv7, Intel, etc.), plusieurs options STL, plusieurs versions Android, etc. C’est pourquoi ndk-build et la structure NDK reposent sur des ndk-build nues. le développement est très impur et peu de projets Android natifs de grand volume existent.

Un grand projet Android est OpenCV où il a fallu développer un script CMake de 1500 lignes pour le comstackr correctement pour Android. À un moment donné, ils ont essayé d’exporter ce script en tant que système de génération basé sur CMake pour Android, mais il n’a pas pu suivre les changements du système NDK et a été abandonné. Ce support aurait dû être à l’intérieur même de NDK.

Le système de construction NDK par défaut aurait dû être une chaîne d’outils autonome, toutes les différentes architectures / bibliothèques C ++ ayant leurs propres chaînes d’outils au désortingment de l’espace de stockage mais avec l’avantage de la propreté, de l’intuitivité et des bonnes pratiques. Ensuite, vous pouvez incorporer tout système de compilation croisée standard qui est également utilisé ailleurs, qui est testé et bien connu, par exemple CMake. Vous pouvez, et à mon avis, vous devriez le faire avec la commande make-standalone-toolchain du NDK, comme indiqué ci-dessus. Mais au final, ce n’est que mon avis. Si vous vous sentez assez à l’aise avec ndk-build alors allez-y.

C’est en fait assez difficile de dire quel est le problème. Voici quelques conseils:

  1. Essayez d’importer et de comstackr hello-jni (il se trouve dans le dossier samples jni ). S’il fonctionne sans problème, le problème est lié à la liaison d’OpenCV à votre projet.
  2. Il semble que vous ayez oublié de mettre à jour l’emplacement d’ android-ndk dans les project properties -> c/c++ build -> environment . Voici un lien vers le problème Problème avec le projet de construction Android NDK .
  3. Construire à partir de la console votre projet ( ndk-build -B ), supprimer toutes les erreurs dans Eclipse manuellement (dans la vue Problems sélectionnez toutes les erreurs et cliquez simplement sur supprimer ) et essayez d’exécuter le projet maintenant. Parfois, ce “hack” m’aide à exécuter un projet.
  4. Fermez Eclipse et supprimez le dossier path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (sauvegardez-le d’abord).

Allez dans Préférences> C / C ++> Mappage de langue> AJOUTER (Source C Fichier et sélectionnez GNU C) Faites la même chose pour C ++

J’ai eu le même problème. J’avais tout le programme d’installation des chemins inclus, mais après avoir ouvert le fichier .c / .cpp ou .h, il commencerait à marquer tout comme «non résolu».
Cela a fonctionné pour moi …
Aller à:
PRÉFÉRENCES -> C / C ++ -> INDEXER
Vérifiez la source d’index et les fichiers d’en-tête ouverts dans l’éditeur .

J’ai eu le même problème, comme beaucoup de gens.

J’ai suivi les étapes dans le post Ayberk Özgür, qui a du sens. Bien que je devais également veiller à inclure des éléments dans les trois langues: GNU C, GNU C ++ et Assembly. Probablement parce que je n’utilise pas une chaîne d’outils autonome.

Au début, je n’incluais que les langages GNU C et GNU C ++. Ce qui m’a laissé encore avec le non résolu inclut l’erreur. Ce n’est que lorsque mes erreurs ont été assignées dans la langue de l’assembleur que mes erreurs ont disparu.

Je ne sais pas pourquoi eclipse ne cherche qu’à travers l’assembleur inclus dans mon projet. Je ne sais pas non plus comment cette partie de la solution fonctionnera pour des projets plus complexes et plus complexes.

J’espère que cela t’aides.

J’ai eu la même situation avec Eclipse CDT travaillant avec la bibliothèque OpenCV. J’ai reçu plusieurs messages d’erreur pendant que le programme compilait correctement. J’ai changé le paramètre de l’indexeur dans la fenêtre “window-> preferences-> Indexer” “construire la configuration de l’indexeur” pour “Utiliser la configuration active” qui a résolu mon problème.

Je viens de passer environ 3h à me cogner la tête contre ce problème d’indexation d’Eclipse NDK! ..

Qu’est-ce qui fait que cela fonctionne: assurez-vous que vous avez une seule architecture cpu spécifiée dans votre fichier Application.mk.

Sinon, le fichier .metadata / .plugins / com.android.ide.eclipse.ndk / *. PathInfo ne sera pas généré par la version NDK. Ce fichier contient des valeurs intégrées de Projet -> Propriétés -> Général C / C ++ -> Chemins et symboles -> Comprend (le simple fait de créer un fichier .pathInfo ne résout pas le problème)