2017-07-10 4 views
0

Je suis en train de tester la création des applications Android intégrant du code C++. Dans cet exemple, j'utilise la bibliothèque OpenCVApplications Android NDK - la meilleure façon d'intégrer un fichier texte pour le déploiement

J'ai configuré l'environnement et j'ai également pu compiler et déployer. L'application fonctionne correctement. Belle jusqu'à ici. Il y a un petit problème d'UX cependant. L'application utilise deux fichiers xml:

haarcascade_frontalface_alt.xml
haarcascade_eye_tree_eyeglasses.xml

mais pour le moment l'utilisateur final doit les poster-télécharger sur l'appareil et dans un dossier donné, sinon l'application serait incapable d'accomplir les détections respectives. Le significant part of code jusqu'à présent est la suivante:

JNIEXPORT void JNICALL Java_com_demo_test_opencvsample_OpenCVClass_faceDetection 
    (JNIEnv *, jclass, jlong addrRgba){ 
    Mat& frame = *(Mat*)addrRgba; 

    detect(frame); 
} 

void detect(Mat& frame){ 
    // these files will be loaded from a specific folder in the phone memory 
    String face_cascade_name = "/storage/emulated/0/data/haarcascade_frontalface_alt.xml"; 
    String eyes_cascade_name = "/storage/emulated/0/data/haarcascade_eye_tree_eyeglasses.xml"; 
    CascadeClassifier face_cascade; 
    CascadeClassifier eyes_cascade; 

    //-- 1. Load the cascades 
    if(!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return; }; 
    if(!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return; }; 


-> question: est-il un moyen d'intégrer les deux fichiers XML directement dans le apk en évitant un utilisateur final avoir à les télécharger séparément sur son appareil après l'installation de l'application? Je voudrais qu'il les ait directement disponibles après que l'application soit installée et le code C++, aussi parce qu'ils ne sont pas censés être changés

NOTE avant de répondre: Je ne suis pas intéressé à mettre deux boutons de téléchargement dans l'application finale et même pas en ayant une solution full-android. Je voudrais maintenir l'architecture actuelle faisant usage de la C de noyau

Merci d'avance à ceux qui tenteront d'aider

+0

Avez-vous envisagé d'utiliser des ressources? (https://coderwall.com/p/0ldbgw/working-with-assets-in-android) – VolAnd

+0

ciao @VolAnd, merci pour votre réponse! Je vérifiais la réponse pour Steve qui est un peu plus complète. J'avais lu sur le dossier Assets et c'est un peu simple de manipulation qu'avec une approche purement Android, j'ai vu aussi cet article qui était très bon: http: //www.41post.com/3985/programming/android-loading-files-from-the-assets-and-raw-folders mais - une fois déplacé dans le dossier Assets - le problème est d'être en mesure d'accéder à ces fichiers via le code C++. Bonne journée! – Antonino

Répondre

1

L'API d'actifs est mentionné comme disponible dans android NDK levels qui transmet à cette page android ndk asset_manager.h

Ici, il décrit un ensemble d'API qui ressemblent à fopen, ce qui permet d'ouvrir des ressources groupées.

Les chemins de codage en dur ne constituent pas la méthode correcte pour gérer vos fichiers, car différents périphériques ou systèmes d'exploitation ultérieurs/passés peuvent réorganiser le système de fichiers.

SO : How to get ExternalDirectory in NDK montre comment en général d'appeler les fonctions Android de NDK, et plus précisément comment charger le externalDirectory -. Le répertoire racine de la carte SD (utilisateur visible lorsqu'un périphérique est connecté à un ordinateur

Pour les fichiers qui sont uniquement lié à votre projet (ce qui semble être le cas ici), je recommande de stocker les fichiers xml dans le répertoire de l'application, accessible par JNI à partir context-> getFilesDir() (voir android : Context

  1. Si vos fichiers xml sont statiques et peu susceptibles de changer plus souvent que votre application, utiliser des actifs.
  2. Si vos fichiers xml seront mis à jour par l'application, ou vous-même, utilisez le getFilesDir()
  3. Si vous voulez que vos utilisations pour voir les fichiers XML, (et être capable de les modifier?) Puis utilisez getExternalDirectory()
+0

ciao @mksteve, j'ai lu vos documents liés et merci beaucoup pour votre temps. Je ne sais pas encore comment procéder selon le point de vue du codage. J'ai mis les deux fichiers xml dans le dossier Assets. Mon idée serait maintenant quelque chose de proche d'appeler quelque chose de C++ qui signifie essentiellement face_cascade.load ("app/src/main/Assets/haarcascade_frontalface_alt.xml"). Donc, pour récupérer à partir de Android votre proposition est de modifier la fonction de chargement OpenCV d'origine [https://github.com/opencv/opencv/blob/master/apps/traincascade/cascadeclassifier.cpp] avec des appels comme AAsset_openFileDescriptor()? savez-vous/avez-vous un exemple? – Antonino