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:
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 –
Was ist die Android-Version Ihres Android-Handys? Denn wenn es größer als Lollipop ist, stellen Sie sicher, dass Sie das Berechtigungsmodell –
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