2013-03-10 2 views
3

ОТКАЗAndroid чтение из файлов и иногда неправильные значения

Проблема была решена, как я описал в комментариях. Я думал об этом, потому что ответа не было, и я не хотел путать других, но мое исправление не обязательно нацелено на проблему, но работает вокруг нее. Поэтому я просто оставлю это в надежде, что когда-нибудь кто-нибудь найдет ответ.

ORIGINAL ВОПРОС

Я использую андроид NDK для чтения из некоторых файлов и у меня возникли некоторые проблемы с выходом. Дело в том, что он работает большую часть времени, но он иногда дает неправильный ввод. Ниже приведен порядок настройки моего кода (обратите внимание, что это не полный код, но если требуется дополнительная информация, я добавлю его. Я просто хочу, чтобы это было просто). Точная проблема - это код ниже.

  1. В файле NDK C++ я использую fstream для чтения из файлов. Файлы хранятся во внутренней памяти телефона, поэтому он работает нормально. Там в 2 файла:

1.1: file1.cpp

JNIExport jdoubleArray class_path_nativeMethod 
       (JNIEnv* env, jclass thiz, jint index, jint size){ 
    jdouble dubArray[6]; 
    jdoubleArray result; 
    result = env->NewDoubleArray(size); 

    string s = "/sdcard/" + construct_fileName(index); 

    ifstream is; 
    if(is.fail()){ 
     return NULL; 
    } 
    is.open(s.c_str()); 

    // read something from the files 
    // save it into dubArray 
    // assign dubArray to result 

    return result; 
} 

1,2: file2.cpp

string construct_fileName(int index){ 
    string s; 

    switch(index){ 
    case 0: 
     s = "file1.ext"; 
     break; 
    case 1: 
     s = "file2.ext"; 
     break; 
    case 2: 
     s = "file3.ext"; 
     break; 
    default: 
     // something 
    } 

    return s; 
} 

2 Сейчас моя основная деятельность, MainActivity.java

private TextView output; 
private TextView output2; 
private RadioGroup radioGroup; 
private Button calculateButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.output = (TextView) findViewById(R.id.textView2); 
    this.output2 = (TextView) findViewById(R.id.textView3); 
    this.radioGroup = (RadioGroup) findViewById(R.id.radioGroup1); 
    this.calculateButton = (Button) findViewById(R.id.button1); 
} 

public void calculate(View v){ 
    int index; 
    switch (v.getId()){ 
    case(R.id.button1){ 
     switch(radioGroup.getCheckedRadioButtonId()){ 
     case R.id.radio0: 
      index = 0; 
      break; 
     case R.id.radio1: 
      index = 1; 
      break; 
     case R.id.radio2: 
      index = 2; 
      break; 
     } 
    } 

    double arr[] = CppMethods.nativeCalculations(index, 2); 
    Double i, j; 
    i = Double.valueOf(arr[0]); 
    j = Double.valueOf(arr[1]); 
    this.output.setText(i.toString().subSequence(0, i.toString().length())); 
    this.output2.setText(j.toString().subSequence(0, j.toString().length())); 
    } 
} 

Таким образом, проблема заключается в том, что значение в текстовых комментариях является правильным в течение большей части времени. Но, допустим, у меня есть кнопка radio0, и я нажимаю объект button 50 раз, я получаю неправильный вывод в текстовых представлениях 5 или 6 раз и исправляю вывод в другие моменты времени.

Некоторая информация, которая может быть полезна:

  • Когда выход неправильно, я получаю некоторое возмутительное количество, как 2.72364283467E17, в то время как выходы я ожидающие двойные значения меньше, чем 20, которые хранятся в файлы.
  • Когда вывод неверный, оба текстовых изображения имеют смехотворное число, показанное выше
  • Правильный код, потому что выход является правильным в большинстве случаев.

Извините за длинный вопрос,

Спасибо,

NAX

+2

можно спросить, почему вы делаете это, это путь? – ElefantPhace

+0

Это временно. Причина, по которой я вводя файлы с помощью C++, заключается в том, что я обработаю их там, прежде чем возвращать значение. Как я уже сказал, большая часть материала выше всего лишь временная, но мне нужно, чтобы она работала, чтобы двигаться дальше. – naxchange

+0

Хмм ... ну, не зная, действительно ли это ваш фактический код, все, что я могу вам сказать, это то, что вы забыли «;» после вашего первого перерыва – ElefantPhace

ответ

0

Это не может решить вашу проблему, но следующие моменты, которые я заметил, может помочь вам:

  1. В вашей команде file1.cpp, снят счёт обработки ошибок env->NewDoubleArray() (или вы пропустите это намерение lly для публикации?)

  2. Я не знаю, как вы назначить double S в jdoubleArray, но вот некоторые лучшие предложения практики от Google (на самом деле это применимо и для других JNI средах тоже):

  3. вопросы многопоточности 1: Если ваш нативный код не готов к многопоточности, я думаю, что лучше добавить synchronized к CppMethods.nativeCalculations() (поскольку fstream еще может быть открытие, когда другой вызов приходит, если не делать этого):

    public class CppMethods { 
        public static native synchronized double[] nativeCalculations(int index, int size); 
    } 
    
  4. Проблемы с Threading 2: Вам может понадобиться что-то вроде runOnUiThread, чтобы обернуть вызовы setText(). Кроме того, интересно, почему вы сделали свой вызов setText() так сложно, я думаю, что это достаточно (кстати, String является CharSequence):

    final double[] arr = CppMethods.nativeCalculations(index, 2); 
    this.runOnUiThread(new Runnable() { 
        public void run() { 
         this.output.setText(String.valueOf(arr[0])); 
         this.output2.setText(String.valueOf(arr[1])); 
        } 
    }); 
    
Смежные вопросы