2016-09-29 3 views
2

Ich versuche, eine App in Android, die OpenCV in C++ verwendet. Das Problem, dem ich gegenüberstehe, ist, dass ich eine Textdatei aus dem nativen Teil öffnen möchte, um sie Wort für Wort zu lesen, aber sie wird nicht geöffnet. Mein Code ist folgende:Öffnen und lesen Sie Textdatei in C++ mit Android (ndk)

JNI-Methode:

JNIEXPORT jboolean JNICALL Java_com_alejandro_nativeopencv_NativeClass_initRecognizer(JNIEnv * env, jclass clazz){ 

    recognizer = Recognizer("ORB","ORB","BruteForce-Hamming"); 
    recognizer.createObject("/storage/emulated/0/TFG/Fotos/Carpeta", true); 
    recognizer.createObject("/storage/emulated/0/TFG/Fotos/Cereales", true); 

    return true; 
} 

Und die Recognizer :: create Methode, die ich benutze:

Recognizer.cpp:

#include "headers/Recognizer.h" 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <android/log.h> 

using namespace std; 
using namespace cv; 

//...other methods, constructors and stuff... 

Object Recognizer::createObject(String path, bool add) { 
    __android_log_print(ANDROID_LOG_DEBUG,"path","%s",(path + "/info.txt").c_str()); 
    ifstream file((path + "/info.txt").c_str()); 
    if (!file.is_open()){ 
     //always enters here 
     return Object(true); //null object 
    } else{ 
     //never enters here 
     String name; 
     vector < vector<KeyPoint> > keypoints; 
     vector <Mat> descriptors; 
     vector < vector<Point2f> > corners; 
     vector <String> viewNames; 
     bool easy; 

     string word; 
     int i = 0; 
     while (file >> word) 
     { 
      if(i == 0){ 

       /* Object name */ 
       name = word; 

       __android_log_print(ANDROID_LOG_DEBUG,"NOMBRE","%s",name.c_str()); 

      } else if(i == 1){ 

       /* Object easy or not */ 
       easy = (word == "true"); 
       __android_log_print(ANDROID_LOG_DEBUG, "EASY", "%d", easy); 
      } else if(i%2 == 0){ 

       /* Object image view*/ 
       keypoints.push_back(vector <KeyPoint>()); 
       descriptors.push_back(Mat()); 
       corners.push_back(vector <Point2f>(4)); 

       Mat image = imread(path + "/" + word, CV_LOAD_IMAGE_GRAYSCALE); 
       this->detector->detect(image, keypoints[(i/2)-1]); 
       this->extractor->compute(image, keypoints[(i/2)-1], descriptors[(i/2)-1]); 
       corners[(i/2)-1][0] = cvPoint(0,0); 
       corners[(i/2)-1][1] = cvPoint(image.cols,0); 
       corners[(i/2)-1][2] = cvPoint(image.cols, image.rows); 
       corners[(i/2)-1][3] = cvPoint(0, image.rows); 
       __android_log_print(ANDROID_LOG_DEBUG, "VISTA", "%d", (i/2)-1); 
      } else{ 

       /* Object name view */ 
       viewNames.push_back(word); 

       String aux = word; 
       __android_log_print(ANDROID_LOG_DEBUG, "VISTA NOMBRE", "%s", aux.c_str()); 
      } 

      i++; 
     } 
     Object obj = Object(name, keypoints, descriptors, corners, viewNames, easy); 

     if(add){ 
      this->objects.push_back(obj); 
     } 

     file.close(); 

     return obj; 
    } 
} 

Das Problem ist hier:

In der JNI-Methode übergebe ich als Parameter den Pfad, wo die Datei info.txt, die ich lesen möchte, befindet, aber es öffnet es nicht (kein Fehler, es tritt nur in der ersten if-Anweisung). Ich habe zuerst versucht, den Ordner in der SD-Karte meines Mobiltelefons und danach in meinem internen Speicher, aber es funktioniert in keiner Weise. Ich habe in meinem Handy, und ich denke, der Weg richtig ist:

Link to the image showing the folder path

Auch habe ich im Android Manifest die Lese- und Schreib externen Speicher Erlaubnis.

Wissen Sie wo oder was ist das Problem hier?

Vielen Dank!

EDIT 1:

Geänderte Code dazu:

__android_log_print(ANDROID_LOG_DEBUG,"path","%s",(path + "/info.txt").c_str()); 
ifstream file; 
file.open((path + "/info.txt").c_str()); 
if (!file.is_open()){ 
    //always enters here 
    return Object(true); //null object 
} else{ 
    //never enters here 
    ...do stuff... 
} 

noch das gleiche Problem.

EDIT 2

Die Log-Ergebnisse Ich bin immer sind diese (sie entsprechen den Pfaden es um Zugang zu versuchen):

D/path: /storage/emulated/0/TFG/Fotos/Carpeta/info.txt 
D/path: /storage/emulated/0/TFG/Fotos/Cereales/info.txt 

Die Datei info.txt in diesem Pfad ist nach mein Gerät:

Photo

+0

fügen Sie die Protokolldetails, die Sie verwenden, plus versuchen Sie diese Methode http: // stackoverflow.com/questions/20663467/jni-Lesen-ein-Text-Datei-in-c-Code-und-Rückkehr-zu-sdk –

+0

Was ist die Android-Version Ihres Android-Handys? Denn wenn es größer als Lollipop ist, stellen Sie sicher, dass Sie das Berechtigungsmodell –

+0

implementiert haben. @PavneetSingh hat die Protokolldetails hinzugefügt. Will versuchen Sie die Methode, die Sie gepostet und Ihnen zu sagen, danke :) PS: Android-Version ist 6.0.1 (Marshmallow) – AMarquez94

Antwort

2

Die file ist man noch nicht geöffnet, ha ve to file.open() Funktion aufrufen, um den Strom mit der aktuellen Datei vor is_open überprüfen zu überprüfen.

file.open(); 
if (!file.is_open()){ 
     return Object(true); 
    } 

Update: Der andere Grund könnte sein, dass Sie nicht Runtime-Berechtigungsmodell haben. versuchen Sie die official docs und this link for precise example

+1

arbeitete wie ein Charme, vielen Dank! (Ich habe deine Antwort aufgestockt, aber sie sagt, dass sie nicht angezeigt wird, weil ich weniger als 15 Punkte habe, sorry). – AMarquez94

Verwandte Themen